Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Наследование


Автор: Karadul 13.6.2012, 10:55
Как так сделать?

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

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;
        
    }
}

Автор: priam220 13.6.2012, 12:40
Как минимум один из конструкторов Вашего объекта не будет содержать this и будет явно или не явно вызывать super.
Суть в том, что пока Вы не вызвали super, ничего касающегося Вашего инстенса, использовать нельзя.

Автор: Karadul 13.6.2012, 13:36
А почему даже переменную обьявить нельзя?

Как создать в конструкторе обьект, сохранить его в поле и передать его конструктору родителя?

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


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

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

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

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

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

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

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

В примере из первого поста я хочу сохранить buf и при этом получить все методы из DataOutputStream. Как это сделать?

Автор: priam220 13.6.2012, 15:25
Код

    public Inherit() throws Exception{

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

    }


protected в FilterOutputStream, поле out.

Автор: Karadul 13.6.2012, 15:37
Ну а предположим, он бы там не сохранялся, что тогда?

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

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

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

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

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

Автор: priam220 13.6.2012, 16:03
Цитата

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

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

Цитата

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

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

Цитата

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

нет.

Автор: Karadul 13.6.2012, 16:37
А тут как сделать?
Код

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 Найти цитируемый пост)
Простите а что Вы пытаетесь сделать? 

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

Автор: priam220 13.6.2012, 17:24
Код

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

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

        super(inputStream);
        length = readInt();


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

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

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


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

То, что есть, меня вполне устраивает.

Автор: priam220 13.6.2012, 17:41
думаю еще вам нужно прочитать какую-нибудь книжку по ООП. smile 

Автор: Karadul 13.6.2012, 18:15
Так можно так сделать или нет?

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

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

Автор: Karadul 14.6.2012, 20:21
Ап. Есть еще предложения?

Автор: Karadul 16.6.2012, 12:29
Цитата(priam220 @  13.6.2012,  17:41 Найти цитируемый пост)
думаю еще вам нужно прочитать какую-нибудь книжку по ООП. smile 

Думаю, Вы и сами-то не знаете.

P.S. Вы при обращении к одному человеку пишется с большой буквы: Вы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)