Mam podklasę, która musi zwrócić podklasę typu zwracanego swojej klasy nadrzędnej. Wierzę, że jest to nazywane kowariantnym typem zwrotu. Zastanawiam się, najprostszy sposób na konwersję z rodzica na klasę podrzędną.Jaki jest właściwy sposób OO do konwersji obiektu na jedną z jego podklas (typ kowariantny)?
Odpowiedz
W PHP nie można "konwertować" obiektów z typu/klasy od A do B za pomocą funkcji dostępnej w języku.
Można to jednak zrobić, korzystając z serializacji, jeśli obiekty go obsługują (zwykle zwykłe stare obiekty PHP obsługują serializację). W formie porysowanej zmieniasz klasę obiektu i ponownie go zsyntezujesz. A zmienił się w B. Ale to nie jest płynne.
To powinno być komentarzem, ale zamierzam zrobić ważny punkt.
Programowanie to inżynieria i programowanie to projektowanie. Nie ma sposobu, aby powiedzieć, dlaczego projekt A jest lepszy niż projekt B, nie wiedząc, w jaki sposób będzie on używany. Zapytaj projektanta, czy przycisk przesyłania ma być czerwony czy zielony - a ona mówi: hmm, gdzie, na której stronie? Zapytaj inżyniera, czy powinieneś użyć belki lub sprzęgu - i odpowiedź będzie: zależy od tego, po co. Co sprawia, że możemy dać ci znaczącą poradę projektową, jeśli dasz nam tylko klasę "BrokenCar" metodą "foo". Powiedz nam, co właściwie chcemy osiągnąć z tym, w przeciwnym razie jedyną odpowiedzią mogę wymyślić jest
najlepszym sposobem korzystania z foo jest bar
Jak hakre stwierdził, rzucając do typów zdefiniowanych przez użytkownika nie jest natywnie możliwe w PHP (o ile wiem).
Co można zrobić, to stworzyć metodę w każdej klasie A lub B. coś takiego:
class A
{
public static function fromB(B $object)
{
/* your routine to convert an object of class B to an instance of class A */
}
/* or */
public static function fromA(A $object)
{
/* your routine to convert any object that is a subclass of A to a concrete instance of class A */
}
}
lub
class B
extends A
{
// this method could even be implemented in A already as well actually
public function toA()
{
/* your routine to convert this object to an object of class A */
}
}
W pierwszym przykładzie pierwszy factory method może być problematyczne, ponieważ wymaga od A posiadania konkretnej wiedzy na temat określonej podklasy. Musisz określić, czy jest to pożądane w twojej sytuacji. Być może mógłbyś to zoptymalizować, aby metoda fabryczna zaakceptowała obiekt, który dziedziczy po A, jak druga metoda fabryczna.
W drugim przykładzie B automatycznie już wie o A, ponieważ dziedziczy po nim. To może być bardziej pożądane. Ale pomyśl o tym, może to być nawet już zaimplementowane w A, tak, że metoda jest automatycznie dostępna we wszystkich podklasach A już.
- 1. Co to jest typ kowariantny?
- 2. Jaki jest właściwy sposób korzystania z PushSharp?
- 3. Jaki jest właściwy sposób sprawdzania typu obiektu dla obiektu Generic?
- 4. Python - jaki jest właściwy sposób kopiowania atrybutów obiektu do innego?
- 5. Jaki jest właściwy sposób na zorientowanie na obiekt programu Android?
- 6. jaki jest właściwy sposób korzystania z scala.io.Source?
- 7. Jaki jest właściwy sposób przekierowania?
- 8. W aplikacji z jedną stroną, jaki jest właściwy sposób postępowania z błędnymi adresami URL (błędy 404)?
- 9. Jaki jest właściwy/właściwy sposób na sprawdzenie, czy obiekt jest obiektem jQuery w javascript?
- 10. Jaki jest właściwy sposób na tworzenie dat w Javie?
- 11. Jaki jest najbezpieczniejszy sposób konwersji tabeli z InnoDB na MyISAM?
- 12. Jaki jest właściwy sposób na pozorowanie funkcji pustych w RhinoMocks?
- 13. Jaki jest właściwy sposób testowania wydajności NFS?
- 14. Jaki jest właściwy sposób dołączania nagłówków Qt?
- 15. Jaki jest właściwy sposób obsługi ciągów char *?
- 16. Jaki jest właściwy sposób odłączania kontrolera MediaController?
- 17. Jaki jest właściwy sposób liczenia w Railsach?
- 18. Jaki jest właściwy sposób wybierania i łączenia obiektów z LINQ?
- 19. Jaki jest właściwy sposób załadowania ListBox?
- 20. Jaki jest właściwy sposób określenia lokalizacji aplikacji?
- 21. Typ konwersji i sposób przeciążenia
- 22. Jaki jest właściwy sposób inicjowania QList?
- 23. Jaki jest właściwy sposób na asynchroniczne uruchamianie kodu Python?
- 24. Jaki jest właściwy sposób oczekiwania na wartości ng-init?
- 25. Jaki jest właściwy sposób kontrolowania powiązanych obiektów w javascript?
- 26. Jaki jest typ obiektu zagnieżdżonego w scala
- 27. Jaki jest właściwy sposób na zawijanie [stringSithFormat NSString:]?
- 28. W C++, jeśli rzut jest wyrażeniem, jaki jest jego typ?
- 29. Jaki jest właściwy sposób na logowanie się do Facebooka dla aplikacji mobilnej (z serwerem node.js/passport.js)?
- 30. jaki jest właściwy, nie deprymujący sposób na obudzenie urządzenia?
Przepraszamy za niewyraźny przykład ... Starałem się uprościć to, co robiłem, być może zbyt wiele. Chciałem zilustrować, że "B" dostarcza dodatkowych metod, które nie istnieją w "A". "B" również nadpisuje niektóre metody z "A" w moim rzeczywistym kodzie. Mogłem skopiować logikę w nadpisanych metodach i po prostu przestałem nazywać rodzicielską metodę "foo", ale to było dużo duplikacji. –