Зачем Inner может наследовать Outer?
От: PsyH0z  
Дата: 25.11.04 10:46
Оценка:
Возник вопрос: для чего может понадобиться такое наследование?

public class Outer {
    class Inner extends Outer{
    }
    Outer(){
        Inner i = new Inner();
    }
}


Ну и если еще добавить:

    public static void main(String[]e) {
        Outer o = new Outer();
    }


вылетает:

java.lang.StackOverflowError
Exception in thread "main"

Объясните?
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re: Зачем Inner может наследовать Outer?
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 25.11.04 10:53
Оценка: 3 (1)
Здравствуйте, PsyH0z, Вы писали:

PH>Возник вопрос: для чего может понадобиться такое наследование?

не знаю, может для вопроса на тестировании.

Кстати, наследование не обязательно

public class TestLoop {
    private static class A {
        public A() {
            B b = new B();
        }
    }

    private static class B {
        public B() {
            A a = new A();
        }
    }

    public static void main(String[] args) {
        new B();
    }
}
ICQ #333355130
Re[2]: Зачем Inner может наследовать Outer?
От: PsyH0z  
Дата: 25.11.04 11:01
Оценка:
Здравствуйте, Lucker, Вы писали:

ну это понятно
Я не про то.
Просто раз сановцы оставили такую возможность наследования, значит она нужна зачем-то... у них нет возможности спросить, вот я и решил здесь.
Сам я, кроме как в случае если внутренний класс будет статический, вообще не могу придумать способов это использовать

L>Здравствуйте, PsyH0z, Вы писали:


PH>>Возник вопрос: для чего может понадобиться такое наследование?

L>не знаю, может для вопроса на тестировании.

L>Кстати, наследование не обязательно


L>
L>public class TestLoop {
L>    private static class A {
L>        public A() {
L>            B b = new B();
L>        }
L>    }

L>    private static class B {
L>        public B() {
L>            A a = new A();
L>        }
L>    }

L>    public static void main(String[] args) {
L>        new B();
L>    }
L>}
L>
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[3]: Зачем Inner может наследовать Outer?
От: dshe  
Дата: 25.11.04 11:24
Оценка:
Здравствуйте, PsyH0z, Вы писали:

PH>Здравствуйте, Lucker, Вы писали:


PH>ну это понятно

PH>Я не про то.
PH>Просто раз сановцы оставили такую возможность наследования, значит она нужна зачем-то... у них нет возможности спросить, вот я и решил здесь.
PH>Сам я, кроме как в случае если внутренний класс будет статический, вообще не могу придумать способов это использовать

А почему бы и нет? Это вроде никак не нарушает концепцию языка и поведение классов вполне предсказуемое.
--
Дмитро
Re: Зачем Inner может наследовать Outer?
От: Tony2k  
Дата: 25.11.04 12:57
Оценка:
Здравствуйте, PsyH0z, Вы писали:

PH>Возник вопрос: для чего может понадобиться такое наследование?


PH>
PH>public class Outer {
PH>    class Inner extends Outer{
PH>    }
PH>    Outer(){
PH>        Inner i = new Inner();
PH>    }
PH>}
PH>


Ну я где-то видел такую контрукцию (не знаю, насколько это правильно). Было примерно так:

public abstract class Dummy {

   public abstract void someMethod();
   
   public static Dummy getDummy() {
   
     return new DummyImpl1(); //Или DummyImpl2 в зависимости от логики...
   }

   class DummyImpl1 extends Dummy {
     public void someMethod() { }
   }

   class DummyImpl2 extends Dummy {
     public void someMethod() { }
   }
}


То есть грубо говоря импелементация абстрактного класса была сделана в inner классах, которые были extended от outer...
Re: Зачем Inner может наследовать Outer?
От: Аноним  
Дата: 25.11.04 13:02
Оценка:
Так не создавай Inner в конструкторе Outer, а используй как-нибудь еще и будет тебе счастье вместо StackOverflow
Re[2]: Зачем Inner может наследовать Outer?
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 25.11.04 13:02
Оценка:
Здравствуйте, Tony2k, Вы писали:

T>Ну я где-то видел такую контрукцию (не знаю, насколько это правильно). Было примерно так:


T>
T>public abstract class Dummy {

T>   public abstract void someMethod();
   
T>   public static Dummy getDummy() {
   
T>     return new DummyImpl1(); //Или DummyImpl2 в зависимости от логики...
T>   }

T>   class DummyImpl1 extends Dummy {
T>     public void someMethod() { }
T>   }

T>   class DummyImpl2 extends Dummy {
T>     public void someMethod() { }
T>   }
T>}
T>


Врядли такую. Компилировать пробовал? Нет? Скажет что-то там про невозожность доступа к this из статичсого контекста.
надо перед class DummyImpl1 extends Dummy и class DummyImpl2 extends Dummy static ставить.

T>То есть грубо говоря импелементация абстрактного класса была сделана в inner классах, которые были extended от outer...

не в inner а в nested
ICQ #333355130
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.