Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> kiedy klasa abstrakcyjna a kiedy interfejs, problem bardziej teoretyczny
squid
post
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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
kubatron
post
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ą. (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Co przyspieszy twój kod. (IMG:http://forum.php.pl/style_emoticons/default/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.

(IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Jak coś nie rozumiesz to strzelaj sprobuje odpowiedzieć (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Można by było na temat interfejsów i klas abstrakcyjnych napisać bardzo dużo i o ich zastosowaniu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Jakby co to poprawcie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował kubatron 1.03.2005, 22:49:13
Go to the top of the page
+Quote Post
DeyV
post
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()
Go to the top of the page
+Quote Post

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: 26.09.2025 - 10:15