Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование 
:(
    Опции темы
Karadul
Дата 13.6.2012, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: 0
Всего: 1



Как так сделать?

Что за хрень? Даже переменную обьявить перед вызовом конструктора нельзя?
Код

public class Inherit extends DataOutputStream {

    private ByteArrayOutputStream buf;

    private Inherit(OutputStream arg0) {
        super(arg0);
    }

    public Inherit() {
        ByteArrayOutputStream buf;
        this(buf = new ByteArrayOutputStream(1024));
        this.buf = buf;
        
    }
}

PM MAIL   Вверх
priam220
Дата 13.6.2012, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Как минимум один из конструкторов Вашего объекта не будет содержать this и будет явно или не явно вызывать super.
Суть в том, что пока Вы не вызвали super, ничего касающегося Вашего инстенса, использовать нельзя.
PM MAIL   Вверх
Karadul
Дата 13.6.2012, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: 0
Всего: 1



А почему даже переменную обьявить нельзя?

Как создать в конструкторе обьект, сохранить его в поле и передать его конструктору родителя?
PM MAIL   Вверх
priam220
Дата 13.6.2012, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Цитата(Karadul @  13.6.2012,  13:36 Найти цитируемый пост)
Как создать в конструкторе обьект, сохранить его в поле и передать его конструктору родителя? 


 myobj(){
   super(new String());
   getMyString(); // superclass method
 }

если Вы значение поля просовываете в суперкласс, то, очевидно, само поле должно быть объявлено тоже в суперклаccе.

Цитата(Karadul @  13.6.2012,  13:36 Найти цитируемый пост)
А почему даже переменную обьявить нельзя?

думаю потому, что до вызова super память под объект еще не выделена. Хранить переменные негде.

Подумал, - к локальным переменным это никакого отношения не имеет, т.к. они хранятся в общем стеке программы. 

Это сообщение отредактировал(а) priam220 - 13.6.2012, 15:57
PM MAIL   Вверх
Karadul
Дата 13.6.2012, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: 0
Всего: 1



Цитата(priam220 @  13.6.2012,  14:47 Найти цитируемый пост)
если Вы значение поля просовываете в суперкласс, то, очевидно, само поле должно быть объявлено тоже в суперклаccе.

А без этого никак?

В примере из первого поста я хочу сохранить buf и при этом получить все методы из DataOutputStream. Как это сделать?
PM MAIL   Вверх
priam220
Дата 13.6.2012, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Код

    public Inherit() throws Exception{

        super(new ByteArrayOutputStream(1024));
            out.close();

    }


protected в FilterOutputStream, поле out.


Это сообщение отредактировал(а) priam220 - 13.6.2012, 15:28
PM MAIL   Вверх
Karadul
Дата 13.6.2012, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: 0
Всего: 1



Ну а предположим, он бы там не сохранялся, что тогда?
PM MAIL   Вверх
priam220
Дата 13.6.2012, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Тогда Вам бы пришлось наследоваться от другого класса или реализовывать все с нуля. Но поскольку ядро пишется программистами высокого класса, то можно быть уверенным на 99.(9)%, что все что нужно в классе, согласно его назначению, в нем будет.

Это сообщение отредактировал(а) priam220 - 13.6.2012, 15:49
PM MAIL   Вверх
Karadul
Дата 13.6.2012, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: 0
Всего: 1



Цитата(priam220 @  13.6.2012,  15:48 Найти цитируемый пост)
Но поскольку ядро пишется программистами высокого класса, то можно быть уверенным на 99.(9)%, что все что нужно в классе, согласно его назначению, в нем будет.

Ну а если бы не ядро? Печально.
Плюс повышается связность кода, если бы в новой версии переменная больше не называлась out, то код бы перестал работать.

out - OutputStream, а не ByteArrayOutputStream. Что с ним сделать - вручную сконвертировать?

А если я в классе заведу переменную out, она не перезапишет out для родительского класса?

Это сообщение отредактировал(а) Karadul - 13.6.2012, 16:02
PM MAIL   Вверх
priam220
Дата 13.6.2012, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Цитата

если бы в новой версии переменная больше не называлась out

если бы такое предусматривалось, то она была бы private.

Цитата

out - OutputStream, а не ByteArrayOutputStream. Что с ним сделать - вручную сконвертировать?

все зависит от того, чего Вы хотите добиться.

Цитата

она не перезапишет out для родительского класса

нет.

Это сообщение отредактировал(а) priam220 - 13.6.2012, 16:50
PM MAIL   Вверх
Karadul
Дата 13.6.2012, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: 0
Всего: 1



А тут как сделать?
Код

public class InPacket extends DataInputStream {
    private DataInputStream inp;
    private int length;
    private byte[] buf;

    public InPacket(InputStream inputStream) throws IOException {
        super(inputStream);
        inp = new DataInputStream(inputStream);
        length = inp.readInt();
        inp.readFully(buf = new byte[length]);
        // дальше все операции идут с buf, а не inputStream
    }
}

in в родительском классе можно как-то перезаписать?

Цитата(priam220 @  13.6.2012,  16:03 Найти цитируемый пост)
если бы такое предусматривалось, то она была бы private.

То есть, все, что protected - задумано для наследования?

Вообще, наследование все-таки не самый чистый метод.

Цитата(priam220 @  13.6.2012,  16:03 Найти цитируемый пост)
Простите а что Вы пытаетесь сделать? 

Упаковщик / распаковщик пакетов. Вы это имели в виду?

Это сообщение отредактировал(а) Karadul - 13.6.2012, 16:52
PM MAIL   Вверх
priam220
Дата 13.6.2012, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



Код

        super(inputStream);
        inp = new DataInputStream(inputStream);
        length = inp.readInt();

а так слабо?   smile 
Код

        super(inputStream);
        length = readInt();


вы просто подумайте какой функционал и какого класса вы хотите расширить и для чего. Посмотрите сырцы java stream'ов.

Это сообщение отредактировал(а) priam220 - 13.6.2012, 17:28
PM MAIL   Вверх
Karadul
Дата 13.6.2012, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: 0
Всего: 1



Цитата(priam220 @  13.6.2012,  17:24 Найти цитируемый пост)
а так слабо?  

Слабо. Я не хочу, чтобы при чтении могло выйти за границу пакета.


Цитата(priam220 @  13.6.2012,  17:24 Найти цитируемый пост)
вы просто подумайте какой функционал и какого класса вы хотите расширить и для чего. Посмотрите сырцы java stream'ов.

То, что есть, меня вполне устраивает.
PM MAIL   Вверх
priam220
Дата 13.6.2012, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 4.6.2010

Репутация: 7
Всего: 8



думаю еще вам нужно прочитать какую-нибудь книжку по ООП. smile 

Это сообщение отредактировал(а) priam220 - 13.6.2012, 17:48
PM MAIL   Вверх
Karadul
Дата 13.6.2012, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.5.2006

Репутация: 0
Всего: 1



Так можно так сделать или нет?

ООП в яве какой-то сложный. По сравнению с питоном по краней мере.

Кроме этого решения, мне приходит в голову только  implements и прокидывание вызовов DataInputStream. Куча копипаста.

Это сообщение отредактировал(а) Karadul - 13.6.2012, 18:16
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.