Czesc,
Mam obiekt który muszę "wzbogacić" o dodatkowe pole (opakować go). Nie mogę ingerować w żaden sposób w kod obiektu który chcę rozbudować (ani w sposób jego tworzenia). Chciałbym żeby w przypadku gdy orginalny obiekt (ten ktory chce rozbudowac) zostanie zmieniony to żeby mój obiekt którym go opakuję miał wszystkie jego nowe metody bez zadnej interwencji z mojej strony. Macie jakiś pomysł (wzorzec projektowy), etc?

- Rejestracja:ponad 21 lat
- Ostatnio:około 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
Ale przecież w temacie sam sobie odpowiedziałeś. Z opisu rozumiem że chodzi ci o wzorzec Dekorator?

- Rejestracja:ponad 18 lat
- Ostatnio:ponad 9 lat
- Postów:1019
Dekorator nie spełnia jednego wymagania - jeżeli do klasy opakowanej dojdzie nowa metoda, to w dekoratorze nie będzie ona automatycznie dostępna (trzeba ją dopisać).
Czy jednak tak silne wymaganie jest naprawdę konieczne?
Jeżeli tak, to możesz zastosować:

- Rejestracja:ponad 21 lat
- Ostatnio:około 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
Faktycznie, nie zauważyłem tego wymagania. Jeśli musi tak być to raczej nie ma innej opcji niż Dziedziczenie albo pobieranie informacji o metodach z refleksji.
W sumie byłoby to logiczne ale chyba zapomniałem wspomnieć o ważnej rzeczy. Nie może zmienić mi się sposób wywoływania kodu. Może przykład przybliży problem:
class KlasaKtorejNieMogeZmieniac{
private a;
private b;
String metodaA(){
return a;
}
String metodaB(){
return b;
}
}
class KlasaPomocnicza extends KlasaKtorejNieMogeZmieniac{
String metodaNowa(){
return "Nowa";
}
}
class C{
Object metodaBiznesowa(){
KlasaKtorejNieMogeZmieniac obj = invoke(...);//jakis kod dostarczajacy mi obiekt klasy "KlasaKtorejNieMogeZmieniac"
//tutaj chciałbym zwrócić obiekt na którym mogę robić wywołania w identyczny sposób jakbym mniał obiekt KlasaKtorejNieMogeZmieniac (wowołuje przy pomocy refleksji)
//takie metody:
//obj.metodaA();
//obj.metodaB();
//Ale oprócz tego rownież
//obj.metodaNowa();
}
}

- Rejestracja:ponad 18 lat
- Ostatnio:ponad 9 lat
- Postów:1019
Dziedziczenie odpada, gdyż nie kontrolujesz tworzenia obiektu.
http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Proxy.html odpada, gdyż KlasaKtorejNieMogeZmieniac nie wystawia swoich metod jako interfejsy.

- Rejestracja:ponad 18 lat
- Ostatnio:ponad 9 lat
- Postów:1019
Jedyna opcja to chyba zastosowanie bibliotek javassist lub CGLib.
np. javassist (zobacz punkt "4.3 Adding a new method or field"):
http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial2.html
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.