Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: kiedy klasa abstrakcyjna a kiedy interfejs
Forum PHP.pl > Forum > PHP > Object-oriented programming
squid
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?
kubatron
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
DeyV
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()
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.