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
DeyV
post
Post #2





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

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: 6.10.2025 - 08:20