Философия Java

Наследование от внутренних классов


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

//: c08:InheritInner.java

// Наследование внутреннего класса.

class WithInner { class Inner {} }

public class InheritInner extends WithInner.Inner { //! InheritInner() {} // Не компилируется

InheritInner(WithInner wi) { wi.super(); } public static void main(String[] args) { WithInner wi = new WithInner(); InheritInner ii = new InheritInner(wi); } } ///:~

Вы можете видеть, что InheritInner расширяется только внутренним классом, но не расширяется внешним. Но когда приходит время для создания конструктора, то конструктор по умолчанию не подходит, Вы не можете передать ссылку на окружающий объект. В дополнение Вы должны использовать такой синтаксис

enclosingClassReference.super();

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



Содержание раздела