Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> klasy abstrakcyjne
Jarod
post
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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thornag
post
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.
  1. <?php
  2. $otwieracz = New Otwieracz()
  3. $otwieracz->addItem(New Plecak());
  4. $otwieracz->addItem(New Slowik());
  5. $otwieracz->closeAll();
  6. ?>


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.

  1. <?php
  2. class WebRequest {
  3.  
  4.  private static $Instance = false;
  5.  
  6. public static function getInstance() {
  7. if(!self::Instance) {
  8.  self::Instance = New WebRequest();
  9. }
  10. return self::Instance;
  11.  }
  12. }
  13. ?>


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)
Go to the top of the page
+Quote Post

Posty w temacie
- 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
- - thornag   Wroce do przykladu z ksiazki. Masz jakis mechanizm...   26.08.2006, 10:24:39


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.12.2025 - 20:43