Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> O abstrakcji klas i interfejsów
daniel1302
post
Post #1





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Witam
dziś szukając informacji o abstrakcji obiektów natchnołem się na ten artykuł
http://blog.dywicki.pl/2007/04/04/o-abstra...-i-interfejsow/


Zrozumiałem tyle:
Abstrakcja
-Wymusza tworzenie obiektów w klasach pochodnych
-Przekazuje informacje o działającym skrypcie


Interfejs
-Wymusza użycie metod w klasach impletujących go
-Przekazuje nadzędzia działającego systemu


Używamy
Klasę abstrakcyjną gdy:
-Mamy mniejszy system
-Musimy zawrzeć w funkcji która będzie wymuszona jakiś kod
-Chcemy używać niektórych z jej metod


Interfejs gdy:
-Mamy wielki system
-Wymuszamy użycie metod w których nie musimy zawierać kodu
-Definiujemy medtody które zainicjujemy w klasach impletujących interfejs



Nie zrozumiałem:
-Co to jest Elastyczność obiektu
-"Budowa złożonej aplikacji bez użycia interfejsów jest posunięciem wysoce nierozsądnym, ponieważ to właśnie dzięki nim, nawet w językach kompilowanych ze statycznym typowaniem jesteśmy w stanie zyskać nadzwyczajnie elastyczny kod"
-"Nawet jeśli koncepcja implementacji obróci się o 180 stopni to nasz interfejs, będący swoistą fasadą, ukryje te zmiany przed osobami, których one nie dotyczą bądź nie interesują."


Dziękuje z góry oraz proszę o wyrozumiałośc ale jeśli mi ktoś nie wytłumaczy nie pojmę niczego tego do końca.

Ten post edytował daniel1302 17.08.2008, 09:26:03
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


  1. <?
  2. metoda_czy_funkcja(NAZWA $zmienna){
  3. }
  4. ?>
W PHP taka konstrukcja oznacza, że parametr $zmienna musi:
1) Obiektem klasy NAZWA
2) Obiektem, któego klasa dziedziczy po NAZWA
3) Obiektem, którego klasa implementuje interfejs NAZWA
(dodatkowo takie wymusznie typu możesz zostosować jeszcze do tablic (array). I niestety tylko tyle)


Co do interefejsów:
Wyobraź sobie, że masz obok siebie cztery telewizory. Każdy z nich ma pięć przycisków:
1) Power (off/on)
2) Zwiększ głośność
3) Zmniejsz głośność
4) Kanał w górę
5) Kanał w dół

Gdy chcesz włączyć którykolwiek z tych telewizorów wykonujesz następującą akację: wciskasz przycisk power. I z Twojej strony to już jest koniec operacji. Teraz wewnątrz telewizora jego elektornika włącza wyświetlacz (zwróć uwagę, że Ciebie to już nie interesuje czy to jest kineskop, ekran LCD czy plazma), głośniki (ponownie nie interesuje Cie czy to jest jeden głośnik mono czy stereo czy może telewizor korzysta z zewnętrznego układu głośników) itp.

Jeszcze jeden przykład: Jakiego byś telewizoru nie kupił będziesz potrafił korzystać z jego podstawowych opcji na pilocie (5 punktów powyżej). Dlaczego? Ponieważ jest tam powtórzony pewien schemat, jednolity interfejs. Oczywiście pilot może oferować dużo większe możliwości (takie, których inne nie oferują) ale te, które są zapisane w interfejscie wykonuje dokładnie tak samo jak inne piloty.

A więc interfejs ujednolica dostęp do określonych zachowań (w OOP można by przyjąć, że w polach przechowujemy stany obiektu (np. telewizor: włączony/wyłączony, glośność 80, 70, 100, kontrast: 75, 22) a w metodach mamy "zachowania" (zmiejsz/zwiększ kontrast, włącz/wyłącz))

Co do klas/metod abstrakcyjnych. One pozwalają na to by pewne zachowania były wspólne dla różnych obiektów. Dzięki temu, że raz zapiszemy pewne zachowanie w klasie abstrakcyjnej (którą dziedziczy klasa dziecko) nie musimy pisać tego samego kodu 5 razy. Ponownie przykład telewizorów:
  1. <?
  2.  
  3. interface iTelewizor{
  4. public function wlacz();
  5. public function glosnosc($wartosc = 0);
  6. public function kontrast($wartosc = 100);
  7. }
  8.  
  9. abstract class Telewizor{
  10. protected $wlaczony = false;
  11. protected $glosnosc = 75;
  12. protected $mute = false;
  13. protected $kontrast = 40;
  14.  
  15. //wszystkie telewizory dzialaja tak samo. Jak jest wlaczony i klikniemy "Power" to sie wylaczy i vice versa
  16. public function wlacz(){
  17. $this->wlaczony = ($this->wlaczony === false) ? true : false;
  18. }
  19.  
  20. protected function mute(){
  21. return $this->mute = ($this->mute === false) ? true : false;
  22. }
  23. }
  24.  
  25. class Kineskopowy extends Telewizor implements iTelewizor{
  26. //nasz kineskopowy telewizor w przypadku gdy glosnosc jest rowna zeru wlacza funkc
    je mute.
  27. public function glosnosc($wartosc = 0){
  28. if($wartosc == 0)
  29. return $this->mute();
  30.  
  31. $this->glosnosc = (int) $wartosc;
  32. }
  33.  
  34. //reszta klasy bez metody wlacz();
  35. }
  36.  
  37. class LCD extends Telewizor implements iTelewizor{
  38. //natomiast nasz nowy LCD, dbajac o nasze zdrowie w przypadku proby ustawienia zby
    t duzej glosnosci poprosi jeszcze o potwierdzenie
  39. //przy $wartosc = 0, nie wlacza mute, poprostu scisza do zera
  40. public function glosnosc($wartosc = 0){
  41. if($wartosc >= 75){
  42. $this->potwierdzenieGlosnosci();
  43. }
  44.  
  45. $this->glosnosc = (int) $wartosc;
  46.  
  47. if($this->posiadamZewnetrzySystemGlosnikow()){
  48. $this->glosnoscSubbuffera = $this->zmiejszGlosnoscSubbufera($wartosc); //w osobnej metodzie, ktora ma jakis tam algorytm okreslajacy o ile zmiejszyc (normalnie powinno okreslac czy zmiejszyc czy wiekszyc w zaleznosci od tego 
    co robimy) glosnosc glosnika niskotonowego
  49. }
  50. }
  51.  
  52. //reszta klasy bez metody wlacz();
  53. }
  54. ?>


Klasy abstrakcyjne pozwalają nam (programiście, nie uzytkownikowi (warto zaznaczyć, że programista jest czasami użytkownikiem)) zaimplementować pewne powatarzale zachowania.
Go to the top of the page
+Quote Post

Posty w temacie


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: 28.12.2025 - 13:03