Ссылаясь на "это" при вызове супер-конструктора? - PullRequest
10 голосов
/ 26 октября 2009

У меня есть класс A и я пишу подкласс B. A имеет только один конструктор, который параметризован. B должен назвать этот супер-конструктор A. Теперь я хочу использовать объект в качестве параметра. Этот объект должен вызывать метод B. Таким образом, параметр-объект должен содержать ссылку на B или должен быть внутренним классом.

public B(){
   super.(new parameter(this))
}

Теперь, когда я хочу вызвать конструктор, как ... Eclipse говорит:

Невозможно ссылаться ни на this, ни на super при явном вызове конструктора

Единственное, что я вижу, чтобы обойти это, - это метод set, который вставляет экземпляр "this" в объект параметра. Я не хотел бы редактировать суперкласс.

Видите ли вы лучший способ обойти это?

1 Ответ

17 голосов
/ 26 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...