Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 1 190 Pomógł: 27 Dołączył: 23.04.2005 Ostrzeżenie: (0%)
|
Tworząc interfejs używamy słowa abstract przy definicji metod.
Po co używa się tego słowa przy definicji klas (lub funkcji - w przypadku gdy nie jest to interfejs) ? W jakim celu tworzyć abstrackyjne klasy? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 504 Pomógł: 2 Dołączył: 31.03.2006 Skąd: Londyn Ostrzeżenie: (0%)
|
Wroce do przykladu z ksiazki. Masz jakis mechanizm do otwierania i zamykania. I tak sobie zamykasz i otwierasz jakas klasa otwieraczem.
Otworzyc mozna: worek, plecak, sloik, drzwi. Worek i sloik a takze reszta nie maja raczej nic wspolnego (no moze worek z plecakiem ale nie o to chodzi), wiec nie mozna zastosowac dziedziczenia bo niby co dziedziczyc ? Z trugiej strony chcesz miec pewnosc ze jak bedziesz uzywac klasy otwieracza to napewno przekazane do niego obiekty beda mialy metody otworz i zamknij. Stad zamiast tworzyc cztery klasy otieracze ktore przyjmuja argumenty na zasadzie addItem1(Worek $worek), addItem2(Plecak $plecak), to tworzysz jedna, ktora w argumencie przyjmuje klasy ktore implementuja interfejs otwierania np. AddItem(Otwieralne $objekt). I teraz masz pewnosci ze niewazne co przekazesz do otwieracza (pod warunkiem ze implementuje wskazany interfejs tu Otwieralne), mozesz wywolac metody zamknij i otworz. Krotki przyklad. Przypuscmy ze otwieracz jest mala kolekcja zeczy do zamkniecia.
Teraz dodales do otwieracza trzy instancje klas implementujacych interfejs otwieralne. Mozesz wiec wywolac metode closeAll() ktora iterujac przez obiekty ktore dodales zamknie je wszystkie. Dlaczego taj jest ? Bo w deklaracji metody addItem klasy otwieracz pokazales jaki tym obiektu mozesz przekazac, czyli addItem(Otwieralne $objekt). Jesli sprobujesz inny to zglosi to blad, bo innego przekazac nie mozna. Sens jest tego taki, ze klasy nie musza po sobie dziedziczyc a ty i tak masz pewnosc ze mozesz uzywac na nich metod ktore musza implementowac bo taknakazuje interfejs. Mam nadzieje ze nie pomotalem Ci za bardzo (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Po co wszystko wymuszac. Nikt nie mowi ze wszystko, no ale wymuszac to po to po co opisalem wyzej, zeby miec pewnosc ze klasy mozna uzyc w miejscach w ktorych sie chce i nic sie nie wysypie. I po co wszyscy maja sie zapoznawac z kazda klasa w projekcie ? Trzeba by bylo analizowac jej kod i stwoerdzic ze nadaje sie do tego zeby jej obiekt przekazac do otwieracza, lepiej zeby wiedzieli ze implementuje ona(badz nie) interfejs otwieralne, wtedy bez zadnej praktycznie wiedzy, i bez znajomosci metody Otworz() Zamknij() wiedza ze moga ta klase przekazac do Otwieracza. Przeciez taki koder micro%^& nie zna kazdego zakamarka kodu Windowsa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) 1. To ze klasa implementuje interfejs nie oznacza ze nie moze miec innych metod. 2. Tak, jesli zaimplementujesz metode i dodasz do niej final, znaczy to ze nie moze byc ona przeciazona w klasach dziedziczacych. Slowo abstract jak najbardziej oznacza ze ta metode trzeba zaimplementowac w klasie dziedziczacej. 3. Co do metody statycznej. Wyobrazmy sobie cos takiego. Na poczatku skryptu tworzydsz instancje obiektu WebRequest ktory trzyma wszystkie POST GET COOKIE itp i pozwala operowac na nich tak czy inaczej. Teraz zapominasz o WebRequest, tworzysz jakas inna klase ktora gdzies tam w srodku uzywa zmiennych GET/POST czy cos tam. Po co korzystac z nich bezposrednio skoro klasa WebRequest zapewnia nam jakies metody do operacji na nich, i teraz co ? Musimy uzyc klasy WebRequest, tworzymy nowa instancje i uzywamy ? No ale po co ? Przeciez w skrypcie wystarczy nam tylko jedna instancja klasy WebRequest. I co z tym fantem zrobic ? Ano tutaj przychodzi nam na pomoc metoda statyczna. Jako ze nie wiesz czy w momencie w ktorym chcesz sie odwolac do metod WebRequest instancja tej klasy jest juz utworzona czy nie w klasie WebRequest implementujesz statyczna metode getInstance(). Przyklad.
W ten sposob jesli musimy sie odwolac do metod WebRequest a wiemy ze nie potrzebujemy wiecej niz jednej jej instancji robimy $objekt = WebRequest::getInstance(); w ten sposob jesli instancja WebRequest nie zostala jeszcze utworzona zostanie utworzona, jesli istnieje zostanie zwrocona istniejaca. To jest wzorzec Singleton, dojdziesz do tego w Twojej ksiazce w rozdziale Warstwa Absrakcji dla bazy danych. Od razu mowie zebys nie wierzyl slepo w te przyklady tam bo sa fatalne. Ten sterownik dla PEAR DB to sciema (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Jakbym pomotal Ci za bardzo to krzycz (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Jest sobota rano kaca mam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
|
J4r0d klasy abstrakcyjne 9.08.2006, 19:44:56
Apo W przeciwieństwie do interfejsów w klasach abstrak... 9.08.2006, 19:56:25
envp Heh wytlumaczone dobrze, ale dziwnie. J4r0d: poj... 10.08.2006, 03:10:21 
J4r0d Cytat(envp @ 10.08.2006, 02:10 ) Heh wytl... 11.08.2006, 21:03:44 
Apo Cytat2. Co dokładnie daje dodanie słowa static po ... 12.08.2006, 09:39:59 
J4r0d Cytat(Apo @ 12.08.2006, 08:39 ) Nie musis... 24.08.2006, 20:20:40
Ludvik Klasy abstrakcyjne nie są wygodnym narzędziem do d... 10.08.2006, 10:01:30
J4r0d Mniej więcej łapie. Wychodzi na to, że lepiej używ... 10.08.2006, 19:17:10
Ludvik CytatWychodzi na to, że lepiej używać klas abstrak... 10.08.2006, 19:29:19 
J4r0d Cytat(Ludvik @ 10.08.2006, 18:29 ) Pamięt... 10.08.2006, 22:40:38
Ludvik A sprawdziłeś czy to działa? Na mój gust działa...... 10.08.2006, 22:46:40 
J4r0d Cytat(Ludvik @ 10.08.2006, 21:46 ) A spra... 10.08.2006, 23:11:05
Ludvik Kilka tematów niżej jest przykładowa odpowiedź. 10.08.2006, 23:14:54
Cysiaczek Sporo sensu to ma.
np. interfejsy:
1. save(), loa... 10.08.2006, 23:17:10
Ludvik W definicji interfejsów nie używamy słowa abstract... 11.08.2006, 21:06:21
Cysiaczek A do pozostałych nie - o to właśnie chodzi.Własni... 24.08.2006, 20:35:47 
J4r0d Cytat(Cysiaczek @ 24.08.2006, 19:35 ) Jeś... 24.08.2006, 20:52:00
dr_bonzo Nie ma klas statycznych, moga byc tylko metody sta... 24.08.2006, 20:51:28
Cysiaczek Faktycznie - trochę nieściśle si... 24.08.2006, 21:27:43
thornag @J4r0d Wracajac jeszcze do pytania abstrakcyjne. P... 25.08.2006, 15:53:26 
J4r0d Cytat(thornag @ 25.08.2006, 14:53 ) Jasny... 25.08.2006, 22:59:29 ![]() ![]() |
|
Aktualny czas: 25.12.2025 - 20:43 |