Oto mój problem, w obliczu którego stoję teraz. Mam klasę, powiedzmy Foo
i ta klasa definiuje metodę o nazwie getBar
, która zwraca instancję Bar
. Klasa Bar
jest zdefiniowana wewnątrz Foo
i jest zadeklarowana jako public static final
. Chcę tylko zdefiniować klasę MyFoo
, która rozszerza się o Foo
, ale chcę również rozszerzyć Bar
o MyBar
przez dodanie własnych funkcjonalności (metod, właściwości itp.). Chcę również getBar
, aby zwrócić MyBar
.Jak przedłużyć ostatnią klasę w Javie
Problem jest kończący się Bar
. Oto ilustracja tego, co chcę zrobić:
public class Foo {
Bar bar = new Bar();
public Bar getBar(){
return bar;
}
....
public static final class Bar {
}
}
Co chcę zrobić, to:
public class MyFoo extends Foo {
public MyBar getBar(){ // here I want to return an instance of MyBar
}
public static final class MyBar extends Bar { // That's impossible since Bar is final
}
}
Jak mogę to osiągnąć?
[EDIT] Dodaję więcej szczegółów do mojego pytania. Aktualnie tworzę wtyczkę dla Jenkinsa i po przeszukaniu zdaję sobie sprawę, że istnieje wtyczka oferująca podstawowe funkcje, które chcę wykonać, Foo
i Bar
. Chcę niestandardowe Foo
i Bar
, więc może pasować do moich potrzeb. Foo jest główną klasą wtyczki i rozszerza klasę o nazwie Builder. Foo definiuje metodę o nazwie perform
, która zawiera wszystkie operacje służące do wykonania kompilacji. Bar
zawiera operacje dla celów konfiguracyjnych, a Foo potrzebuje paska, aby uzyskać te informacje.
Więc chcę rozszerzyć Foo o MyFoo
i dodać kilka konfiguracji z MyBar
. I jak widać, MyFoo
będą musiały uzyskać te configuations wywołując getBar();
Drugą rzeczą jest to, że nie mają kontroli nad instanciation z MyFoo
i MyBar
, co mnie bloków, jest to, że nie mogę przedłużyć Bar. Jak mogę to osiągnąć?
Ponieważ modyfikator 'final' zapobiega podklasowaniu' Bar', polecam "zawijanie" go. – mre
Jeśli 'Bar' jest' ostateczną klasą' zwykle jest z jakiegoś dobrego powodu, np. może dlatego, że wymagają tego niektóre niezmienniki 'Foo'. Więc nie zrobię tego, a przynajmniej powinieneś dokładnie zrozumieć cały odpowiedni kod źródłowy, a być może przepisać go ponownie. –
Zapytaj programistę 'Bar', aby uczynił go nieostatnim lub skorzystaj z delegacji, jak sugeruje mre. –