![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Przykład z książki:
I teraz mam prosbę o wyjaśnienie 1. Wiadomo, że można tworzyć obiekt gdy definicja klasy występuje w kodzie po utworzeniu obiektu (nie ma konieczności napisania definicji funkcji przed jej wywołaniem). Czy nie wyraźniej (bardziej zrozumiale dla osoby, która przejmuje np. jakiś projekt) byłoby napisać te interfejsy w kolejności: Instrument, Musician, Band ? 2. W definicji interfejsów i klasy (które podałem wyżej) nie rozumię pewnej kwestii i prosiłbym osoby, które dobrze znają OOp o wytłumaczenie: Dlaczego w interfejsie Musician jest public function addInstrument (Instrument $instrument); a nie public function addInstrument ($instrument); ? Podobnie jest w klasie Guitarist - dlaczego zamiast public function addInstrument(Instrument $instrument) nie jest public function addInstrument(Instrument $instrument) ? |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
1. Przyjęta kolejnośc to tylko i wyłącznie decyzja autorów. Ja też uważam że powinno być Instrument, Musician, Band
2. Taki zapis oznacza wymuszenie typu. public function addInstrument (Instrument $instrument); oznacza że parametr $instrument musi byc instancją klasy Instrument. Więcej: Podręcznik php :: Classes and Objects (php 5) :: Type Hinting |
|
|
![]()
Post
#3
|
|
Administrator PHPedia.pl Grupa: Developerzy Postów: 1 102 Pomógł: 2 Dołączył: 14.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
Cytat 2. Taki zapis oznacza wymuszenie typu. public function addInstrument (Instrument $instrument); oznacza że parametr $instrument musi byc instancją klasy Instrument. Albo, co chyba najważniejsze, jej potomnych. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#5
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
Musi być instancją klasy intrument czy klas, które implementują interfejs instrument? Hmm, nieprecyzyjnie napisałem. Musi być instancją klas implementujących interfejs Instrument, lub jak ~bela zauważył klas pochodnych do tych klas. P.S. Nie można utworzyć instancji interfejsu. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
Hmm, nieprecyzyjnie napisałem. Musi być instancją klas implementujących interfejs Instrument, lub jak ~bela zauważył klas pochodnych do tych klas. P.S. Nie można utworzyć instancji interfejsu. Czyli do metody public function addInstrument (Instrument $instrument); można przekazać wszystkie obiekty, które implementują interfejs Instrument?
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 352 Pomógł: 0 Dołączył: 22.01.2006 Ostrzeżenie: (0%) ![]() ![]() |
Wymuszenie typów możesz zastosować tylko w definicji metod, kiedy wywołujesz metode nie podpowiadasz już jakiego typu jest przesłana przez Ciebie zmienna a więc tak:
Zakładam, że gdzieś wcześniej określiłeś zmienną $instrument i jest to instancja klasy implementującej Instrument. Ten post edytował mariuszn3 6.08.2006, 13:34:04 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 352 Pomógł: 0 Dołączył: 22.01.2006 Ostrzeżenie: (0%) ![]() ![]() |
Nie wiem rozumowanie jakiej kwestii masz na myśli.. ale zapis jest jak najbardziej prawidłowy..
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 352 Pomógł: 0 Dołączył: 22.01.2006 Ostrzeżenie: (0%) ![]() ![]() |
Jest błędne tylko dlatego, że Klasa3 nie ma zdefiniowanej metody addInstrument()
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 352 Pomógł: 0 Dołączył: 22.01.2006 Ostrzeżenie: (0%) ![]() ![]() |
To, że nie implementuje nie oznacza, że jej metody nie mogą przyjmować instancji obiektów które implementują instrument.
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
To, że nie implementuje nie oznacza, że jej metody nie mogą przyjmować instancji obiektów które implementują instrument. Zgłupiałem już: Hmm, nieprecyzyjnie napisałem.
Musi być instancją klas implementujących interfejs Instrument, lub jak ~bela zauważył klas pochodnych do tych klas. |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 352 Pomógł: 0 Dołączył: 22.01.2006 Ostrzeżenie: (0%) ![]() ![]() |
No dobrze.. ale co musi być instancją tych klas? Klasa do której metody się odwołujesz.. czy obiekt, który przekazujesz do metody? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ..przyjrzyj się temu uważnie.
|
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%) ![]() ![]() |
No dobrze.. ale co musi być instancją tych klas? Klasa do której metody się odwołujesz.. czy obiekt, który przekazujesz do metody? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ..przyjrzyj się temu uważnie. Nie wiem już o czym piszesz. Możesz to jakoś jaśniej wytłumaczyć? |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 352 Pomógł: 0 Dołączył: 22.01.2006 Ostrzeżenie: (0%) ![]() ![]() |
Przyjrzyj się uważnie podanemu przez siebie przykładowi z książki i temu co Ty później napisałeś. Kluczową różnicą jest to, że w przykładzie z książki klasa Guitarist nie implementuje interfejsu Instrument.. nie mniej jej metoda addInstrument() przyjmuje obiekty, które implementują instrument..
To co później napisałeś to coś zupełnie innego - stwierdzenie, że jeśli klasa sama w sobie nie implementuje danego interfejsu to jej metody nie mogą przyjmować obiektów, które implementują dany interfejs co jest z zasady bzdurnym założeniem. |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 359 Pomógł: 1 Dołączył: 16.04.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Stary, nie zagłębiaj się, aż tak, bo po pierwsze w tej książce w kodach są błędy, po drugie, autorzy napisali ją tak jakby to było dla nich karą a po trzecie do OOP trzeba dorosnąć i i tego nei nauczysz się tak o .. pstryk i juz (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) OOP to idea programowania. Przeczytaj gdzies tak do narzedzi uzytecznych czy jak to tam bylo i od tamtad zacznij dopiero psiac (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . Pozatym uzupelniaj sie googlem, bo naprawde ta ksiazka jest 'zakrecowna'
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 21:21 |