Mam 2 klasy w różnych namespace o takich samych nazwach i metodach, ale są to wtyczki z zewnętrznych bibliotek i nie mogę dodać wspólnej klasy/interfejsu
A/MyClass z metodą print() //Zwraca "Hello"
B/MyClass z metodą print() //Zwraca "World"
W moim programie chcę dodać wykonanie tych metod, ale muszę dodać na końcu wykonanie metody endText(), która dla pierwszej klasy zwróci "!", dla drugiej "...".
interface Ending {
endText()
}
class MyAClass extends A/MyClass implements Ending {
endText() { log('!') }
}
class MyBClass extends B/MyClass implements Ending {
endText() { log('...') }
}
main() {
objects = [ new MyAClass, new MyBClass ]
foreach(obj in objects) {
obj->print()
obj->endText()
}
//Hello!
//World...
}
W jaki sposób mogę teraz dodać wspólną metodę dla tych dwóch klas? Myślałem o abstrakcji zamiast interface (template method), ale wtedy dziedziczenie po klasie odejdzie i trzeba będzie implementować wywołanie print przez klasę która obecnie jest rodzicem... Dodać nową klasę jako pole w stylu strategy pattern i wywołanie w kodzie aplikacji?
P.S. Na początku pytanie było trochę inne, bo się zagapilem upraszczając problem do tego przykładu.
A/MyClass z metodą print() //Zwraca "Hello"
B/MyClass z metodą print() //Zwraca "World"
W moim programie chcę dodać wykonanie tych metod, ale muszę dodać na końcu wykonanie metody endText(), która dla pierwszej klasy zwróci "!", dla drugiej "...".
interface Ending {
endText()
}
class MyAClass extends A/MyClass implements Ending {
endText() { log('!') }
}
class MyBClass extends B/MyClass implements Ending {
endText() { log('...') }
}
main() {
objects = [ new MyAClass, new MyBClass ]
foreach(obj in objects) {
obj->print()
obj->endText()
}
//Hello!
//World...
}
W jaki sposób mogę teraz dodać wspólną metodę dla tych dwóch klas? Myślałem o abstrakcji zamiast interface (template method), ale wtedy dziedziczenie po klasie odejdzie i trzeba będzie implementować wywołanie print przez klasę która obecnie jest rodzicem... Dodać nową klasę jako pole w stylu strategy pattern i wywołanie w kodzie aplikacji?
P.S. Na początku pytanie było trochę inne, bo się zagapilem upraszczając problem do tego przykładu.
Jaki to język? @Vuaaas
@ZyGi PHP, tylko kod uproszczony. Wiem że można dodać Trait który umożliwia takie jakby dziedziczenie po kilku klasach, ale zastanawiam się co będzie najlepszym rozwiązaniem w innych językach nie umożliwiających wielokrotnego dziedziczenia i bez Traitów
Nie wiem czy dobrze rozumiem problem, plus nie znam PHP. Ale jeśli dobrze rozumiem. To mnie to wygląda na zadanie dla dekoratora... Trochę zawile to opisałeś
Zaloguj się aby komentować