2013-07-24 2 views
1

Предположим, у меня есть два класса под названием «SuperClass» и SubClass. SubClass расширяет SuperClass.Переменная экземпляра Sub класса в объекте суперкласса?

Я только узнал, что SuperClass не может иметь переменную экземпляра типа SubClass.

То есть, это не будет работать:

class SuperClass{ 
    SubClass x = new SubClass(); 
} 

, потому что это приводит к тому, конструкторами звонить друг другу, входя в бесконечную петлю. (потому что Java автоматически помещает вызов в Super())

Создает ли переменная экземпляра подкласса невозможной и плохую дизайнерскую идею? или есть какая-то работа?

ответ

2

Как правило, это плохая идея. Если вашему суперклассу нужен экземпляр подкласса, это запах кода. Он создает круговые зависимости и предлагает разбитый анализ.

Обходной путь/исправление, как правило, воспитывает любой код, который суперкласс использует из подкласса в суперклассу.

0

Единственное ограничение заключается в размещении распределения подкласса (или, если на то пошло, другого экземпляра суперкласса) внутри конструктора суперкласса. Конечно, вы можете иметь поле экземпляра с типом подкласса и установить его в какой-то момент после построения суперкласса. (Хотя вы, очевидно, должны были бы предотвратить рекурсию через метод сеттера.)

И на самом деле один мог поставить распределение в конструктора суперклассе, если были условная логика в конструкторе, чтобы пропустить выделение при построении подкласса. Например:

class SuperClass { 
    SubClass subClassField; 
    SuperClass() { 
     if (!(this instanceof SubClass)) { 
      subClassField = new SubClass(); 
     } 
    } 
} 

Но, конечно, только потому, что вы можете сделать это не говорит, что вы РЕКОМЕНДУЕМЫМ. Хотя я могу представить несколько сценариев, где это может быть действительный подход, они будут «странными» ситуациями.

Смежные вопросы