![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 114 Pomógł: 12 Dołączył: 15.02.2012 Ostrzeżenie: (0%) ![]() ![]() |
Jako, że jestem nowy w OOP to za bardzo nie wiem dlaczego w tym kodzie (z książki) jest błąd. Wg. autora powinno być dobrze ale nie jest. Problem rozwiązują szybkie zmiany w kodzie ale nie o to mi chodzi. Raczej szukał bym jakiejś literówki ewentualnie wytłumaczenia dlaczego nie działa
![]()
Wynik skryptu wygląda tak:
Ten post edytował spokoloko123 8.05.2012, 14:42:15 -------------------- Pomogłem? Kliknij POMÓGŁ
|
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 45 Pomógł: 5 Dołączył: 26.06.2011 Ostrzeżenie: (0%) ![]() ![]() |
nadpisujesz konstruktor w klasie ExtendedEmailer.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 915 Pomógł: 210 Dołączył: 8.09.2009 Skąd: Tomaszów Lubelski/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Nie wywołujesz konstruktora klasy po której dziedziczysz.
Ten post edytował redeemer 8.05.2012, 14:53:45 -------------------- |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Nie wywołujesz konstruktora klasy po której dziedziczysz. Raczej jest tak, jak napisał Psajkus. spokoloko123 przeciąża konstruktor klasy, po której dziedziczy, wobec czego kod tego konstruktora nie jest wykonywany. Przeciążenia takiego powinniśmy dokonać wtedy, gdy klasa ExtendedEmailer będzie np. ustawiać dodatkowe właściwości/pola istotne dla tej właśnie klasy. Jeśli nie ma takiej potrzeby, to nie musimy przeciążać konstruktora i deklaracje funkcji __construct() w klasie dziedziczącej powinniśmy pominąć. Edycja: Wobec powyższego klasa ExtendedMailer mogłaby wyglądać po prostu tak:
Przy czym drugi sposób nie jest do końca prawidłowy, bo umożliwia utworzenie obiektu Mailera, który nie posiada "właściciela" (czyli osoby, która może z tego mailera korzystać (identyfikowanej po adresie e-mail)). Ten post edytował mortus 8.05.2012, 15:12:39 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 114 Pomógł: 12 Dołączył: 15.02.2012 Ostrzeżenie: (0%) ![]() ![]() |
Okazało się to erratą w książce. Dla przyszłych pokoleń:
-------------------- Pomogłem? Kliknij POMÓGŁ
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Nadal nie jest to coś co można by nazwać poprawnym kodem. Klasa Emailer w metodzie addRecipients() zakłada, że właściwość recipients jest tablicą w momencie gdy tak na prawdę nie jest. Poniższy kod wywali błąd:
Tak więc jak już to:
PS. Skoro metoda addRecipients() dodaje tylko jednego odbiorcę, to czy nie powinna nazywać się addRecipient()? Ten post edytował Crozin 8.05.2012, 15:19:36 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 114 Pomógł: 12 Dołączył: 15.02.2012 Ostrzeżenie: (0%) ![]() ![]() |
1. Dodaje paru (gdy dziedziczona)
2. Kod z przykładu w książce, nie mój 3. Tak, wywali ale nie jest to problem, bo jest używana tylko jako dziedziczenie (wiem głupie, patrz punkt 2) ![]() 4. Dlaczego są te nawiasy klamrowe? np:
Dzięki za zainteresowanie. Ten post edytował spokoloko123 8.05.2012, 15:27:33 -------------------- Pomogłem? Kliknij POMÓGŁ
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 664 Pomógł: 169 Dołączył: 8.01.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Abstrahując od Twojego problemu, który już został rozwiązany, to wydaje mi się, że hierarchia, którą tutaj przedstawiłeś jest totalnie bez sensu i nazywanie tego OOP jest 'lekkim' przekłamaniem. Jeżeli taki przykład jest w książce, to wrzuć tytuł, aby przyszłe pokolenia programistów po coś takiego nie sięgały:)
Dlaczego przykład jest zły? Klasa ExtendedEmailer jest całkowicie nie potrzebna i tworzona chyba tylko po to, aby zrobić dziedziczenie. Wszystko co się w niej dzieje, to nadpisanie konstruktora i utworzenie metody setSender(), która poprzez swoją logikę wymusza zmianę widoczności atrybutu sender w klasie nadrzędnej na protected (czego również warto unikać ![]() Jeżeli istnieje sytuacja, że klasę tworzysz bez sendera i dodajesz go później (setSender()), to na co Ci nowa klasa? Wystarczy zmienić konstruktor w klasie Emailer tak, żeby parametr był opcjonalny i do tej klasy dodać metodę setSender(). I po sprawie. Nadmierne dziedziczenie stwarza wiele problemów (pewnie nawet jest to jakiś antywzorzec:P). Dodatkowa rada, to nie zmieniaj deklaracji metody jeżeli rozszerzasz klasę tzn. jeżeli deklaracja klonstruktora w klasie rodzica jest: __construct($sender), to w klasach podrzędnych również taka powinna być. -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 02:28 |