Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 186 Pomógł: 4 Dołączył: 13.10.2009 Ostrzeżenie: (0%)
|
Witam serdecznie,
W ostatnim czasie czytam książkę o PHP aby poukładać sobie odpowiednio informacji, aż tu nagle okazało się że są tu jeszcze inferfejsy ... Najgorsze jednak jest to, że nie bardzo to rozumiem. Tzn wiem, ze interface przechowuje jedynie funkcje metody ( bez żadnych instrukcji ) i teraz chciałem zapytać w jakim celu są stosowane czy dobrze rozumiem ,że deklarując klasę która implementuje interfejs musi posiadać metody które zawiera interface? Jeżeli tak, to czy klasy dziedziczące po klasie implementujacej dany interfejs musi posiadać również te metody czy nie? Ten post edytował Micchaleq 21.11.2011, 09:36:23 |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%)
|
Interfejs to nic innego jak wytyczne do utworzenia klasy zgodnej z jakimś wzorcem, bądź mogącej zostać użytej w jakimś kontekście.
Tak jak pisałeś interfejs to deklaracja metod, które MUSZĄ być zaimplementowane w klasie. Przykładem może być na przykład coś takiego:
Aby policzyć teraz ile elementów ma niby_tablica::$tablica należało by napisać tak:
Ale łatwiej było by napisać:
Tyle, że to nie zwróci nam tak naprawdę wielkości zmiennej $tablica. Możemy zaimplementować Interfejs Countable, który ma raptem jedną metodę count()
Teraz wyświetli to autentyczną liczbę elementów tablicy $tablica. Ale... czy zadziałało by to bez "implements Countable"? Po prostu samo dodanie metody count() czy da taki sam efekt? - Odpowiedź jest prosta - NIE - dlaczego? Bo php'owa funkcja count sprawdza czy ma do czynienia z obiektem i jeśli tak to sprawdza czy implementuje on interfejs Countable i jeśli tak to używa jego funkcji count() - bo ma pewność, że ów obiekt taką posiada - wymaga to implementacja interfejsu. Interfejsu służą zatem do deklarowania ogólnych list metod wymaganych przez jakiś obiekt, ale jak widać nie tylko (IMG:style_emoticons/default/tongue.gif) jeżeli interesujesz się tym dalej - zapoznaj się również z klasą abstrakcyjną (IMG:style_emoticons/default/wink.gif) Ten post edytował Sephirus 21.11.2011, 09:48:44 |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 186 Pomógł: 4 Dołączył: 13.10.2009 Ostrzeżenie: (0%)
|
Oki to mniej więcej już to rozumiem,
teraz pozostają 2 ostatnie kwetiw, Czy klasa dziedzicząca po klasie implementującej musi posiadać również te metody? np :
PS : Właśnie o te abstrakcyjne klasy chciałem zapytać bo już się z nimi spotkałem Ten post edytował Micchaleq 21.11.2011, 09:50:30 |
|
|
|
Post
#4
|
|
|
Grupa: Administratorzy Postów: 1 552 Pomógł: 211 Dołączył: 7.07.2009 Skąd: NJ |
Klasy abstrakcyjne zawierają po prostu definicje metod (np. wspólne funkcjonalności dla grupy klas) w odróżnieniu od interfejsów.
|
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 1 527 Pomógł: 438 Dołączył: 28.06.2011 Skąd: Warszawa Ostrzeżenie: (0%)
|
Na to pytanie można odpowiedzieć sobie samemu (IMG:style_emoticons/default/smile.gif) Jeżeli klasa "A" to klasa podstawowa, implementuje ona Interfejs "I" to klasa "B" dziedzicząca od "A" ma to wszystko co "A" prawda? (IMG:style_emoticons/default/smile.gif) Więc - TAK ma od razu zaimplementowany Interfejs (IMG:style_emoticons/default/wink.gif)
Co do klas abstrakcyjnych to prosty przykład:
Po klasie abstrakcyjnej można jedynie dziedziczyć - w pewnym sensie działa ona jak interfejs bo wymusza zaimplementowanie w pochodnej klasie metod oznaczonych jako "abstract" ale pozwala ona także na deklaracje zwykłych metod i własności, które można normalnie dziedziczyć (IMG:style_emoticons/default/wink.gif) Istnieje możliwość zablokowania zmiany metody w klasach pochodnych poprzez dodanie przed nimi "final" - tak samo jeśli da się to przed deklaracją samej klasy - nie można z niej dziedziczyć (IMG:style_emoticons/default/wink.gif) |
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 186 Pomógł: 4 Dołączył: 13.10.2009 Ostrzeżenie: (0%)
|
No to ostatnie pytanie.
otóż gdzieś wyczytałem, że klasa abstrakcyjna implementująca dany interface nie musi posiadać wszystkich metod które są w nim zdeklarowane. Czy to prawda? |
|
|
|
Post
#7
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Cytat Czy to prawda? Przecież może napisać sobie prosty interfejs, prostą klasę abstrakcyjną i sam sprawdzić czy to prawda czy nie, prawda?
|
|
|
|
Post
#8
|
|
|
Grupa: Zarejestrowani Postów: 186 Pomógł: 4 Dołączył: 13.10.2009 Ostrzeżenie: (0%)
|
|
|
|
|
Post
#9
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Skoro ci nie działałalo, znaczy że nie można (IMG:style_emoticons/default/smile.gif)
ps: albo napisałeś zły kod, bo raczej można (IMG:style_emoticons/default/wink.gif) |
|
|
|
Post
#10
|
|
|
Grupa: Zarejestrowani Postów: 186 Pomógł: 4 Dołączył: 13.10.2009 Ostrzeżenie: (0%)
|
Zły kod czy odpowiedz na moje pytanie ? Ten post edytował Micchaleq 21.11.2011, 10:44:04 |
|
|
|
Post
#11
|
|
|
Grupa: Moderatorzy Postów: 36 561 Pomógł: 6315 Dołączył: 27.12.2004 |
Prawidłowy kod potwierdzający twoje pytanie - nie musi posiadać
Coś ci nie działa ten kod? Bo mi działa wyśmienicie
Powód edycji: [nospor]:
|
|
|
|
![]() ![]() |
|
Aktualny czas: 23.12.2025 - 23:42 |