![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 1 Dołączył: 4.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Czesc.
Czy ktos z Was spotkal sie moze z "problemem" (nie wiem, czy moja taktyka jest dobra, dlatego w cudzyslowiu) dziedziczenia po klasie abstr., ktory polega na tym, iz w momencie nadpisania metody klasa potomna musi uzyc parametrow zadeklarowanych w klasie nadrzednej ? Dokladnie chodzi mi o:
Powyzszy przyklad zwraca Strict'a: [i]Strict Standards: Declaration of Pies ::nakarm() should be compatible with that of Zwierze [...][/i Czy to jest zly przyklad uzycia klasy abstrakcyjnej ? Jesli Zwierze nie byla by abstrakcyjna, to rozwiazuje problem. Moge nadpisywac metody, ale to rozwiazanie jest zle w moim wypadku. To musi byc klasa abstrakcyjna. Ten post edytował jacekkobus 4.09.2009, 02:26:52 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 1 012 Pomógł: 109 Dołączył: 26.09.2003 Skąd: nexis.pl Ostrzeżenie: (0%) ![]() ![]() |
Klasa dziedzicząca po klasie abstrakcyjnej musi posiadać dokładnie takie same metody z dokładnie tymi samymi parametrami. Taki jest jej sens, więc prawdopodobnie źle zaprojektowałeś system, skoro jest to dla Ciebie przeszkodą.
-------------------- |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 80 Dołączył: 31.05.2008 Ostrzeżenie: (20%) ![]() ![]() |
Kolega jacek chyba nie wiem o tym że nie można utworzyć obiektu klasy abstrakcyjnej, więc hermetyzacja metod w tejże klasie jest bezcelowa.
-------------------- cojack blog - mój blog (na jakiś czas off).
"jak czegoś nie wiem, to nie myślę że wiem" - moja domena |
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Nadpisywanie metod to po prostu zmiana ich i tylko IMPLEMENTACJI. Inna lista paremtrow w metodzie == INNA METODA.
Inna kwestia jest ze php nie pozwoli ci dodac kilku metod o tej samej nazwie, z inna lista parametrow (to nie Java, C#, C, ....). -------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 91 Pomógł: 9 Dołączył: 6.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
jak chcesz implementowac różne metody dla róznych zwierząt tylko pozostawiając jednakowe nazwy - uzyj interfaców
-------------------- www.quider.pl <- moja prywatna strona
Pomogłem? Kliknij Pomógł |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 561 Pomógł: 72 Dołączył: 15.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Quider nie masz racji
![]()
-------------------- Nawet świnka może wejść na drzewo kiedy jest chwalona :)
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 18 Pomógł: 1 Dołączył: 4.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Klasa dziedzicząca po klasie abstrakcyjnej musi posiadać dokładnie takie same metody z dokładnie tymi samymi parametrami. Taki jest jej sens, więc prawdopodobnie źle zaprojektowałeś system, skoro jest to dla Ciebie przeszkodą. A moge nadpisac konstruktor klasy abstrakcyjnej zmieniajac przy tym parametry ? Pozniej pozostaje wywolanie parent::__construct( [...] ); Kolega jacek chyba nie wiem o tym że nie można utworzyć obiektu klasy abstrakcyjnej, więc hermetyzacja metod w tejże klasie jest bezcelowa. Wyjasnij. Jesli dobrze rozumiem, hermetyzacja polega na ukrywaniu pol lub metod danej klasy w taki sposob, aby byly one widoczne tylko dla klas zaprzyjaznionych badz, tak jak w moim wypadku, klasy potomnej. Interfejs zewnetrzny klasy ktorej instancja zostala stworzona czesto nie potrzebuje wszystkich metod, ktore zawarte sa w klasie abstrakcyjnej, wiec po co ma miec do nich dostep ? Jesli juz jestesmy przy mechanice dzialania ukadu trawiennego zwierzat, to po co mi w interfejsie zewnetrznym "psa', w ktorym przyjmuje jedzenie, metoda odpowiadajaca za trawienie danego pokarmu ![]() Moze ja cos zle rozumiem. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
Co do hermetyzacji, to się nie zgodzę z przedmówcą. Owszem, nie można utworzyć obiektu klasy abstrakcyjnej, ale można utworzyć obiekt klasy dziedziczącej po klasie abstrakcyjnej i uważam, że ze względu na właśnie ten obiekt byłoby miło taką klasę abstrakcyjną zahermetyzować odpowiednio.
Zmiana prototypu metody -> generalnie można to robić:
Nie jest to jednak zalecane, tj. PHP zgłasza wtedy komunikat E_STRICT. Jeśli jednak przed A::foo() dopiszemy słówko kluczowe abstract, albo taką metodę zadeklarujemy w interfejsie, diametralnie zmienia to postać rzeczy. Wtedy przy próbie użycia innego prototypu niż zadeklarowany dostaniemy ten sam komunikat, co poprzednio, ale już o statusie błędu krytycznego. -------------------- Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 06:44 |