Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> kiedy klasa abstrakcyjna a kiedy interfejs, problem bardziej teoretyczny
squid
post 1.03.2005, 21:58:39
Post #1





Grupa: Zarejestrowani
Postów: 358
Pomógł: 0
Dołączył: 3.07.2003
Skąd: Szczecin->niebuszewo->*(next to window)

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


Mam pewien problem ze stosowaniem klas abstrakcyjnych i interfejswo. Jakie jest kryterium wyboru miedzy tymi dwoma mechanizmami obiektowymi bo jak dobrze rozumiem jest miedzy nimi praktycznie (PHP5) jedna roznica mianowicie w klasie abstrakcyjnej czesc metod moze byc juz zaimplementowana tymczasem w interfejscie mymy doczynienia zawsze z prototypami, innymi slowy interfejs to klasa abstrakcyjna bez mozliwosci implementacji w niej metod. Czy dobrze rozumiem? to jest jedyna roznica?


--------------------
Jeśli życie to kara to nieźle nabroiłem ;-)
Go to the top of the page
+Quote Post
kubatron
post 1.03.2005, 22:25:46
Post #2





Grupa: Zarejestrowani
Postów: 581
Pomógł: 0
Dołączył: 21.07.2003
Skąd: Jasło

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


Klasy abstrakcyjne możesz tworzyć jak zwykłe klasy czyli:
  1. <?php
  2. abstract class silnik {
  3. private $oD = NULL;
  4. function A( $oD ) {
  5. //...
  6. }
  7. }
  8. ?>


I teraz nie możesz jak przy zwykłej klasie utwórzyc jej czyli zaimplementować w sposób:
  1. <?php
  2. $oAbstract = new silnik;
  3. ?>

Bo są one stworzone wyłącznie do deklarowania i dziedziczenia przez inne klasy, i może się to przydać gdy nie chcemy tworzyć obiektu tej klasy tylko odziedziczyc ją. smile.gif

Interfejsy, jest to bardzo ciekawa rzecz w PHP5 która się przydaje i przyspiesza kod o wiele.Działają one na zasadzie deklarowania metod, i pózniejszym nadpisaniu, pozwala to przyspieszyć kod o niezbędne tworzenie metod w klasie smile.gif Możesz to użyć np. przy tworzeniu jakiegoś mechanizmu.
DB_DRIVER:
  1. <?php
  2. interface SQL {
  3. public function __construct();
  4. public function Connect();
  5. public function Query();
  6. //itp...
  7. }
  8. ?>

I w tym intefejsie po zaimplementowaniu do klasy np. Mysql metody będą nadpisywane a nie tworzone smile.gif Co przyspieszy twój kod. smile.gif

Czyli podsumowując Interfejsy używamy by przyspieszyć kod o niezbędne tworzenie metod w klasie. A klasy abstrakcyjne sa po to by nie tworzyć zbędnych obiektów, co daje nam odziedziczanie klas abstrakcyjnych.

smile.gif
Jak coś nie rozumiesz to strzelaj sprobuje odpowiedzieć smile.gif Można by było na temat interfejsów i klas abstrakcyjnych napisać bardzo dużo i o ich zastosowaniu smile.gif
Jakby co to poprawcie smile.gif

Ten post edytował kubatron 1.03.2005, 22:49:13


--------------------
„Człowiek jest wielki nie przez to, co posiada, lecz przez to, kim jest;
nie przez to, co ma, lecz przez to, czym dzieli się z innymi.”
Jan Paweł II
Go to the top of the page
+Quote Post
DeyV
post 2.03.2005, 01:30:45
Post #3





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




kubuś - namieszałeś nieco, choć same przykłady kodu podałeś poprawnie.
Problem polega bowiem na tym, że dzięki interfejsom kod nie staje się nawet minimalnie szybszy. Można nawet zaryzykować stwierdzenie, że jest wolniejszy.
Pozwala jednak na pisanie znacznie bezpieczniejszych aplikacji, i łatwiejsze wykrywanie błędów. Dlatego przydają się bardzo.

squid - podstawowa wartość interfejsów pojawia się dopiero wtedy, gdy zaczynasz korzystać z biblioteki SPL (polecam serdecznie) - gdzie interfejsy dają dodatkowe możliwości poszczególnym obiektom, lub gdy chcesz przeprowadzać test na typ wprowadzanego do metody parametru.

Wtedy szczególnie przydaje się możliwość implementowania kilku różnych interfejsów, co nie jest możliwe w przypadku klas (nie można dziedziczyć po 2 klasach równocześnie).

  1. <?php
  2.  
  3. interface Samochod{
  4. function run();
  5. }
  6.  
  7. interface PojazdPasazerski{
  8. function otworzDrzwi();
  9. }
  10.  
  11.  
  12. class Maluch implements Samochod {
  13. function run(){
  14. echo ' pyr pyr ';
  15. }
  16. }
  17.  
  18. class Ford implements Samochod, PojazdPasazerski{
  19. function run(){
  20. echo ' brum ';
  21. }
  22.  
  23. function otworzDrzwi(){
  24.  echo ' cyk ';
  25. }
  26. }
  27.  
  28.  
  29. ####
  30.  
  31. function cosZDrzwiami( pojazdPasazerski $Car ){
  32. $Car->otworzDrzwi();
  33. }
  34.  
  35. function jedziem( samochod $Car ){
  36. $Car->run();
  37. }
  38.  
  39. $Auto1 = new Maluch;
  40. $Auto2 = new Ford;
  41.  
  42.  
  43. // w obu przypadkach zadziała poprawnie, choć inaczej;)
  44. jedziem( $Auto2 );
  45. jedziem( $Auto1 );
  46.  
  47.  
  48.  
  49. cosZDrzwiami( $Auto2 );
  50.  
  51. cosZDrzwiami( $Auto1 ); // maluch nie musi mieć drzwi;) wiec nie zostanie przyjęty do tej funkcji - fatal error
  52. ?>


Powyższy przykład pokazuje, że jeśli programista piszący funkcję cosZDrzwiami zażyczy sobie, by otrzymywany parametr był typu pojazdPasazerski, to może być pewien, że obiekt ten ma dostępną, publiczną metodę
otworzDrzwi(), gdyż jest ona wymuszona przez interfejs.
Natomiast piszący jedziem() wie, że w otrzymanym obiekcie będzie zaimplementowana metoda run()


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2025 - 04:30