![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 122 Pomógł: 0 Dołączył: 23.01.2006 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Nigdzie nie moge doczytac jaka jest praktyczna roznica miedzy interfejsem i klasa abstrakcyjna. Teorie znam, interfejs definiuje nagłowki metod danej klasy, klasa abstrakcyjna ma wieksze mozliwosci, moze ponadto definiowac zawartosc metody. Chodzi mi jednak jak to sie sprawdza w praktyce, kiedy zastosowac interfejs a kiedy klase abstrakcyjna, po co tak naprawde mam w ogole definiowac "ogolny zarys" klasy w interfejsie czy klsaie abstrakcyjnej? Pozdrawiam |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 634 Pomógł: 14 Dołączył: 27.05.2006 Skąd: Berlin Ostrzeżenie: (0%) ![]() ![]() |
Interfejs sie najbardziej sprawdza kedy ty piszesz program i API do tego programu, wtedy zmuszasz uzerow do uzywania interfejsu, i wiesz jak np. wywolac ten mod.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 660 Pomógł: 13 Dołączył: 9.06.2004 Skąd: Wrocław i okolice Ostrzeżenie: (0%) ![]() ![]() |
Dam Ci definicję i przykład. Poprę się tym samym ksiązką "php 5 Nowe Możliwości"
1. Interfejsy Przy pomocy interfejsów masz możliwość wymuszenia na klasach, aby posiadały niezbędne do współpracy z innymi elementami metody. Np. piszesz sklep i kążdy produkt musi mieć nazwę, cenę i numer identyfikacyjny. Robisz sobie interfejs:
We wnętrzu interfejsu definiuje się prototypy metod. teraz każda klasa, która będzie implementowała ten interfejs musi posiadać podane metody. Np. klasa Book:
Jeśli klasa nie będzie posiadała wszystkich metod wymieniony w interfejscie php wygeneruje błąd krytyczny. 2. Klasy abstrakcyjne Klasy te mają to do siebie, że nie można stworzyć ich kopii. Np. robisz sobie klasę Ziemia.
Nie mogą istnieć dwie Ziemie ![]() -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 122 Pomógł: 0 Dołączył: 23.01.2006 Ostrzeżenie: (0%) ![]() ![]() |
TomASS, ale widze ze to sie sprawdza tylko wtedy kiedy dajemy skrypt do rozbudowy przez innego programiste, bo przeciez sam i tak wiem jakie metody ma zawierac dana klasa...
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Przyjaciele php.pl Postów: 698 Pomógł: 3 Dołączył: 28.03.2004 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Programowanie to zazwyczaj praca grupowa, dlatego powstają takie, a nie inne rozwiązania. Równie dobrze, można pisać w assemblerze, bo przecież nikt inny tego czytać nie będzie.
Interfejsy i klasy abstrakcyjne pomagają w uporządkowaniu struktury aplikacji. Pozwalają na zachowanie kontroli typów, dzięki czemu możesz się spodziewać określonego zachowania po danym obiekcie. Klasy abstrakcyjne pozwalają na zdefiniowanie niektórych metod, dzięki czemu tworząc rodzinę klas, nie musisz dla każdej implementować funkcji takich jak getId(). Sprzyja to powstawaniu mniejszej ilości błędów (eliminujemy powtórzenia kodu). Drugą właściwością tych klas jest fakt, że nie możesz utworzyć z nich obiektu. Przydaje to się do tworzenia całkowicie statycznych klas. -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Nie koniecznie dla innego programisty. Piszac duza aplikacjie (tzn zlozona), w koncu zapomnisz o czyms. Interfejsy ratuja wtedy skore
![]() Klase definiuje sie jako abstrakcyjna w chwili, kiedy nie chcesz aby ktos utworzyl jej obiekt. Taka klase da sie tylko dziedziczyc, co w praktyce oznacza ze klasa abstrakcyjna nie jest kompletne klasa. Dziedziczenie uzupelnia klase i wtedy mozemy stworzyc dzialajacy obiekt. Pokaze na przykladzie: Mamy w aplikacji klase wyswietlajaca dane (widok w MVC). Czesto piszemy kilka widokow - np. taki wyswietlajacy dane na podstawie szablonow php. Do tego doliczmy, ze mozemy miec widok wyswietlajacy dane jak leci oraz taki, ktory udekoruje je o cala strone (stopka, naglowek, menu itp.). Wiadomo, ze takie widoki powinny miec metody taki, jak:
W ten sposob zdefiniowalismy interfejs dla klas widoku. Od tech chwili, kazda implementujaca klasa ten interfejs bedzie musiala je miec. Ale pomyslmy przez chwile. Czy klasa widoku normalna i dekorujaca nie bedzie miala takich samych metod getAttribute(), removeAttribute(), __set(), __get()? Po co powielac kod - napiszemy klase abstrakcyjna:
Dlaczego klasa musi byc abstrakcyjna: 1. Pominmy slowo kluczowe abstract. Proba utworzenia obiektu tej klasy zakonczy sie bledem. Klasa przeciez nie definiuje metody fetch(), ktora wymusza interfejs. 2. Nie chcemy przeciez utowrzyc (najczesciej przez pomylke) obiektu widoku, ktory nie dziala. Lepiej rozszerzac klase (dziedziczyc od niej). W ten sposob zbudujemy klasy widokow, ktore dzialaja, a maja mniej kodu (bo przeciez dziedzicza z tej klasy abstrakcyjnej). A jak wyglada przykladowy widok?
Dodam jeszcze, ze nowy widok nie musi juz implementowac interfejsu, poniewaz dziedziczy implementacje z klasy abstrakcyjnej, Proste i wygodne ![]() Pozdrawiam, Adrian. Ten post edytował Prph 16.07.2006, 10:25:21 |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 487 Pomógł: 7 Dołączył: 7.01.2004 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Interfejsy uwalniają nas w pełni od jakiejkolwiek implementacji.
Klasy abstrakcyjne zawierają już implementację niektórych mechanizmów, które zachowują się w ten sam sposób w wielu miejscach. Możesz określić wewnątrz klasy abstrakcyjnej wszystkie metody jako finalne i jedną jako abstrakcyjną, którą powinna implementować tylko klasa wyspecjalizowana. ![]() Są ludzie, którzy twierdzą, że zanim napiszesz jakąkolwiek klasę powinieneś stworzyć interfejs. Trudno się z nimi niezgodzić.. sam powoli zaczynam stosować tą praktykę i muszę przyznać, że jest ona bardzo użyeczna. ![]() -------------------- Łukasz Dywicki
Independent Java and open source software consultant. Blog - Java, OSGi, integracja oprogramowania.. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 384 Pomógł: 6 Dołączył: 11.09.2004 Skąd: Grodzisk Mazowiecki Ostrzeżenie: (0%) ![]() ![]() |
TamASS ładnie wytłumaczył.
Warto dodać jeszcze jedną dość ważną rzecz. Otóż w php można dzidziczyć jedynie po jednej klasie, natomiat interfaców, można implementować wiele ![]() Więc kontynując post TomASS'a, w kodzie mozemy stworzyć:
W naszym sklepie mamy książkę kucharską, która jest produktem - ksiązką ![]() W telegraficznym skrócie. Bez odbioru. -------------------- |
|
|
![]()
Post
#9
|
|
Administrator PHPedia.pl Grupa: Developerzy Postów: 1 102 Pomógł: 2 Dołączył: 14.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
2. Klasy abstrakcyjne Klasy te mają to do siebie, że nie można stworzyć ich kopii. Np. robisz sobie klasę Ziemia.
Nie mogą istnieć dwie Ziemie ![]() Nie kopii, a obiektów. Trzeba je wydziedziczyć i nadpisać wszystkie metody abstrakcyjne. Dwa obiekty mogą być typu Ziemia. Co prawda pośrednio, bo musisz wydziedziczyć Ziemia, ale zawsze. -------------------- |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 1 660 Pomógł: 13 Dołączył: 9.06.2004 Skąd: Wrocław i okolice Ostrzeżenie: (0%) ![]() ![]() |
Cytat Nie kopii, a obiektów. Kopii ![]() Cytat Dwa obiekty mogą być typu Ziemia. Co prawda pośrednio, bo musisz wydziedziczyć Ziemia, ale zawsze. Zależy jak na to spojżeć ![]()
Oczywiście masz rację, jeśli chodzi o "pośredniość" i "wydziedziczenie". -------------------- |
|
|
![]()
Post
#11
|
|
Administrator PHPedia.pl Grupa: Developerzy Postów: 1 102 Pomógł: 2 Dołączył: 14.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
Oczywiście, że nie można bo jak napisałeś, Ziemia to klasa abstrakcyjna, a nie dlatego, że może posiadać tylko jedną instancję. -------------------- |
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 1 660 Pomógł: 13 Dołączył: 9.06.2004 Skąd: Wrocław i okolice Ostrzeżenie: (0%) ![]() ![]() |
Skoro tak mówisz
![]() ![]() -------------------- |
|
|
![]()
Post
#13
|
|
![]() Grupa: Przyjaciele php.pl Postów: 384 Pomógł: 6 Dołączył: 11.09.2004 Skąd: Grodzisk Mazowiecki Ostrzeżenie: (0%) ![]() ![]() |
Cytat Skoro tak mówisz smilingsmiley.gif Poddaję się i przyznaję, że masz rację smilingsmiley.gif Dobrze mówi ponieważ nie można tworzyć instancji klasy abstrakcyjnej. Poprostu klasą abstrakcyjną w tym przypadku powinno być Planet, a ziemia powinna odziedzić planet czyli EarthPlanet() etc. -------------------- |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 359 Pomógł: 1 Dołączył: 16.04.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Hm, roznica wydaje sie byc nieznaczaca, ale jednak jest. W intrefejsie podajemy tylko nazwy metod, a w klasie abstrakcyjnej mozemy w takiej metodzie zawrzec jakies dzialanie. Po co? - odpowiedz jest prosta jesli nasza metoda (w interfejsie) ma 10 linijek kodu, interfejsu uzywamy w 10 klasach, a metoda dla niech jest taka sama, to po co pisac 10x10 linijek kodu wiecej, skoro mozna zrobic abstrakcyjna klase z metoda juz zdefiniowana i pozostale klasy zrobic jej dziecmi?
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 898 Pomógł: 48 Dołączył: 2.11.2005 Skąd: Poznań Ostrzeżenie: (0%) ![]() ![]() |
Mi wydaję się, że różnica jest bardzo duża
![]() Interfejs ma natomiast inną przewagę: jedna klasa może implementować bardzo wiele interfejsów. Druga kwestia, taka może troche bardziej koncepcyjna, to to, że klasa abstrakcyjna zazwyczaj jest dość mocno związana z obiektami dziedziczącymi w sensie logicznym -> czyli np. jak ktoś mówił tworzysz klasę Planet a potem wszystkie planety dziedziczą po tej klasie. Interfejsc natomiast nie musi być już tak mocno związany z daną klasą -> np możesz stoworzyć interfejs Idestroyable, który mówi że dany obiekt może zostać zniszczony. Taki interfejs możesz nadać zarówno obiektomy klasy Planet, Star, Person, Car itp. Różnica IMHO jest dość znaczna, ale wychodzi dopiero w większych projektach, gdzie trzeba śledzić wiele zależności itp. W małych projektach typu strona z panelem admina różnica jest często praktycznie niewidoczna. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 22.06.2025 - 04:35 |