2009-10-26 16 views
10

Mam klasy A i napisać podklasę B. A ma tylko jeden konstruktor, który jest parametryzowany. B musi wywołać tego super konstruktora A. Teraz chcę użyć obiektu jako parametru. Ten obiekt powinien wywoływać metodę B. Zatem obiekt-parametr musi zawierać referencję B lub musi być klasą wewnętrzną.Nawiązując do "tego" podczas wywoływania super konstruktora?

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

Teraz, gdy chcę wywołać konstruktora jak ... Eclipse mówi:

nie może odnosić się do 'tego' ani 'super', podczas gdy wyraźnie wywoływania konstruktora

Jedyne, co widzę, aby obejść ten problem, to metoda setowa, która wprowadza instancję "this" do obiektu parametru. Nie chciałbym edytować super-klasy.

Czy widzisz lepszy sposób obejścia tego.

+0

Jakiego * języka * mówisz? –

+11

zobacz znacznik Jonathan ... jego java – craftsman

Odpowiedz

17

Kompilator naprawdę uniemożliwia ci strzelanie sobie w stopę. B nie jest w pełni skonstruowane aż do wywołania super konstruktora, więc jeśli przekażemy to (jeśli kompilator na to zezwolił) jako odniesienie i wywoła metodę na B, B będzie w stanie niepoprawnym i spowoduje wszystkie rodzaje nieprzyjemnych problemów (w rzeczywistości A nie jest jeszcze inicjowany, ani żadna klasa nie podniosła łańcucha, łącznie z Object).

Oczywistym rozwiązaniem jest zapewnienie funkcji poza B i przekazanie jej do konstruktora parametru. Konkretne rozwiązania będą zależeć od konkretnego problemu, ale statyczna klasa zagnieżdżona wewnątrz B (musi być statyczna z tego samego powodu - klasa wewnętrzna ma niejawne odwołanie do instancji klasy zewnętrznej) może zapewnić tę funkcjonalność. Być może trzeba ponownie przemyśleć związek między parametrem, B i jego super klasy. Wszystko zależy od przypadku.

+0

Wiem, jak go rozwiązać. Prawdziwy problem polega na tym, że super klasa to "stary" kod. Używam go w nieco innym kontekście. Szukałem eleganckiego rozwiązania. Ale myślę, że nie ma. Jest to cena za ponowne użycie starego kodu. –

+2

Można go po prostu skomponować, umieszczając nową klasę jako opakowanie wokół starej. Czy stara klasa implementuje interfejs, który można zaimplementować z nowym obiektem? – Joe

+1

@ c0d3x, możesz zamieścić swoje rozwiązanie (w osobnym pytaniu) i zapytać, czy istnieje bardziej eleganckie rozwiązanie. Gdy zobaczysz swoje rozwiązanie, odpowiedziałbyś na wiele pytań dotyczących konkretnego przypadku. – Yishai

Powiązane problemy