Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Interfejs a klasa abstrakcyjna
Forum PHP.pl > Forum > PHP > Object-oriented programming
Cadious
Witam,
Właśnie zacząłem zgłębiać tajniki programowania obiektowego i natrafiłem na problem z interfejsami i klasami abstrakcyjnymi. Otóż nie wiem kiedy stosować interfejs a kiedy klasę abstrakcyjną. Szukałem w internecie i przeczytałem kilka wątków (na ten temat) na forum jednak nie znalazłem dokładnej odpowiedzi na moje pytanie. Więc czy ktoś mógłby mi wytłumaczyć różnice między interfejsem a klasą abstrakcyjną (i kiedy się je stosuje)?
Sedziwoj
Podstawowa różnica że interfejs określa tylko interfejs klas dziedziczących, natomiast abstrakcja implementuje część wspólną dla klas dziedziczących.
webdice
Ostatnio na forum był poruszany ten temat.
Sokal
No to tak:

Klasa abstrakcyjna - taka klasa ma w sobie deklaracje i definicje metod (i ew. pól). Jej dzieci są taką jakby częścią klasy. Np. jest klasa abstrakcyjna figura. Dziedziczą po niej takie klasy jak koło, kwadrat, trójkąt. Figura zawiera już pewne właściwości, które są wspólne dla wszystkich figur.

Interfejs - narzuca klasie jakie metody powinna posiadać. Tutaj występują same deklaracje. W przeciwieństwie do klas abstrakcyjnych mogą one mieć różne definicje.
Sedziwoj
Cytat
W przeciwieństwie do klas abstrakcyjnych mogą one mieć różne definicje.

@Sokal w abstrakcji możesz też zdefiniować tylko interfejsy (u Ciebie deklarować) (a dokładnie metody abstrakcyjne które wymagają implementacji) więc mogą też mieć różne definicje (cze też jak ja piszę implementacje)
Sokal
@up
No racja, np. w tej klasie Figura może być metoda abstrakcyjna pole() albo obwod() :-)
gWd
Jeszcze jedna różnica:
Klasa może dziedziczyć tylko po jednej klasie abstrakcyjnej (bezpośrednio), ale może implementować wiele interfejsów.
SongoQ
Cytat
Klasa abstrakcyjna - taka klasa ma w sobie deklaracje i definicje metod (i ew. pól). Jej dzieci są taką jakby częścią klasy.

A co ciala moze nie ma?

Nie mozna tworzyc obiektu klasy abstrakcyjnej jedynie inna klasa moze dziedziczyc po niej i wtedy mozna stworzyc obiekt. Klasa abstraktyjna to taki twor ktory cos robi a tak naprawde nie mozna go wykorzystac bezposrenio tylko po przez dzidziczenie przez inna klase.
Ludvik
Może autorowi rozjaśni trochę sytuację wzorzec Template Method, typowe użycie klas abstrakcyjnych. Powinno raczej używać się interfejsów, bo są wygodniejszym narzędziem, głównie dlatego, że udostępniają wielokrotną implementację i dziedziczenie. Klasy abstrakcyjne wprowadza się raczej w chwili, gdy potrzebujemy zdefiniować pewien interfejs, ale w klasach dziedziczących może wystąpić duplikacja kodu. Wtedy kod umieszczamy w klasie abstrakcyjnej i nie przesłaniamy wybranych metod.

Chyba, że mamy inne zastosowanie, takie jak np. wspomniany przeze mnie wzorzec...
Joachim Peters
Może mi ktoś podać jakieś bardziej `kodowe` zastosowanie klas abstrakcyjnych i interfejsów bo nie mogę tego zrozumieć.
Cysiaczek
Przeanalizuj wątek http://forum.php.pl/index.php?showtopic=65622&hl=
Pod koniec znejdziesz też elegancko przedstawione zastosowania interfejsów.

Pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.