Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Interfejs i klasa abstrakcyjna
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, mam problem teoretyczny. Jest taka sytuacja
Mam klasę abstrakcyjną Człowiek, która realizuje jakieś opcje.
I różni ludzie dziedziczą po tej klasie np:

  1. class Daniel extends Czlowiek
  2. {
  3. ...
  4. }


i chcę aby każdy człowiek posiadał odpowiednie metody(które np ustalają co człowiek potrafi, jak myśli, dla każdego wykonanie tej metody ma być inna).

mogę zrealizować to za pomocą interfejsu np. Interface Genetyka
  1. interface Genetyka
  2. {
  3. public function wyglad();
  4. public function umiejetnosci();
  5. }

i wtedy będę miał:
  1. class Daniel extends Czlowiek implements Genetyka
  2. {
  3. ...
  4. }

ale coś mnie to kole w oczy. Ale mogę dodać metody do klasy abstrakcyjnej skoro i tak każdy człowiek po niej dziedziczy.
Co wy byście zrobili. Zastosowali interface czy dodali definicje metod do klasy.

Ten post edytował daniel1302 30.11.2011, 17:32:19
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Orzeszekk
post
Post #2





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

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


Najczysciej będzie jak zrobisz najpierw interfejs z metodami ktore maja byc publiczne i sluzyc do komunikacji z obiektem, a pozniej klasę abstrakcyjną go implementującą, a kolejne klasy ludzi bedziesz tworzyl rozszerzajac tą klasę abstrakcyjną.

Jedna uwaga - jezeli te metody maja byc chronione/prywatne to interfejs na to nie pozwoli, wtedy zostaniesz zmuszony by byly one publiczne, co z definicji jest bez sensu bo interfejs ma byc zbiorem metod publicznych pozwalajacych sie komunikowac z obiektem.

  1. interface Genetics
  2. {
  3. public function look();
  4. public function skills();
  5. }
  6.  
  7. // Nie dodajesz juz abstrakcyjnych metod Look i Skills bo interfejs je wymusza
  8. abstract class Human implements Genetics
  9. {
  10. public function createHuman()
  11. {
  12. $this->makeHumanCosTam();
  13. $this->look();
  14. $this->skills();
  15. }
  16.  
  17. protected function makeHumanCosTam()
  18. {
  19. // TODO wpisz cos
  20. }
  21. }
  22.  
  23. class Daniel extends Human
  24. {
  25. public function look()
  26. {
  27. // TODO wpisz cos
  28. }
  29.  
  30. public function skills()
  31. {
  32. // TODO wpisz cos
  33. }
  34. }
  35.  
  36. abstract class UfoHuman implements Genetics
  37. {
  38. public function createHuman()
  39. {
  40. $this->look();
  41. $this->skills();
  42. $this->drawLegs();
  43. }
  44.  
  45. abstract protected function drawLegs();
  46. }



interfejs ma tą wadę że żadnych wspolnych metod do niego nie wrzucisz a ludzie na pewno beda mieli wspolne metody.

Albo np ludzie beda cos robic tak samo ale w nieco inny sposob, wtedy mozesz uzyc wzorca metoda szablonowa i wspolną czesc kodu zapisac w klasie abstr. a te wyrozniajace ludzi w klasach potomnych a w samym interfejsie szablonu nie zaimplementujesz.

A jak cie dalej bedzie kuło w oczy, to zacznij pisac nazwy metod i zmiennych po angielsku (IMG:style_emoticons/default/biggrin.gif)


Interfejsu uzywaj tylko wtedy jak wiesz ze bedziesz musial dziedziczyc po kilku klasach - w php tego nie zrobisz, bedziesz musal zastapic klasy interfejsami. Choc i wtedy mozna wylaczyc wspolny czynnik przed nawias - porobic klasy abstrakcyjne dla kazdej kombinacji interfejsów ze sobą.

jesli chcesz podszkolic sie z podręcznikowej obiektowości to polecam książkę Kenta Becka chyba ale nie dam sobie głowy uciąć, w każdym razie książka nazywa się "Clean Code" lub "Czysty kod. Podręcznik dobrego programisty". Jest na pewno w twojej bibliotece na uczelni, a jeżeli nie to na necie po angielsku.

Ten post edytował Orzeszekk 30.11.2011, 20:02:50
Go to the top of the page
+Quote Post

Posty w temacie
- daniel1302   Interfejs i klasa abstrakcyjna   30.11.2011, 16:40:20
- - Orzeszekk   Najczysciej będzie jak zrobisz najpierw interfejs ...   30.11.2011, 19:50:16
- - Crozin   To co tu kole w oczy to kompletny brak związku z O...   30.11.2011, 20:53:33
|- - Orzeszekk   Cytat(Crozin @ 30.11.2011, 20:53:33 )...   30.11.2011, 22:25:27
- - Crozin   CytatCzy Daniel nie jest czlowiekiem? Czy Kamil - ...   30.11.2011, 22:56:51
|- - Orzeszekk   Cytat(Crozin @ 30.11.2011, 22:56:51 )...   30.11.2011, 23:09:31
- - Dipter   @Orzeszekk Twoje uwagi w stosunku do Crozina mają...   30.11.2011, 23:20:09
- - ano   Orzeszekkk... przecież to teraz Ty strasznie miesz...   30.11.2011, 23:26:36
- - Orzeszekk   Jak tam sobie chcecie. Dla mnie nielogiczne jest z...   30.11.2011, 23:39:31
- - Dipter   Zacznijmy od tego, że to że Daniel to świr i ma ni...   30.11.2011, 23:49:43
|- - Orzeszekk   Cytat(Dipter @ 30.11.2011, 23:49:43 )...   30.11.2011, 23:53:07
- - ano   Dalej to co mówisz jest nielogiczne. Z tego by wyn...   30.11.2011, 23:51:03
- - Dipter   Dlaczego metodą? Może być równie dobrze obiektem k...   30.11.2011, 23:59:29
|- - Orzeszekk   Cytat(Dipter @ 30.11.2011, 23:59:29 )...   1.12.2011, 00:04:47
- - Dipter   Na Ciebie nigdzie nie wjeżdżam więc przestań zmyśl...   1.12.2011, 00:10:20
- - LSM   CytatJak zajdzie potrzeba zmian to kolega sobie to...   1.12.2011, 09:58:24
- - phpion   @Orzeszekk: [PHP] pobierz, plaintext class Human ...   1.12.2011, 10:14:49
- - Pilsener   CytatZ elastycznością czeka się do ostatniego mome...   1.12.2011, 14:28:18
- - LSM   @Pilsener Nie zrozumiałeś mnie. Zdarzyło Ci się ki...   2.12.2011, 10:05:29
- - bastard13   Zgadzam się z LSM, że myślenie 'na przyszłość...   2.12.2011, 11:33:03
- - daniel1302   Może opiszę projekt dokładniej. Tworzę algorytm gr...   2.12.2011, 17:47:04
- - Crozin   No to możesz to zrobić w taki sposób:[PHP] pobierz...   2.12.2011, 19:22:17
- - daniel1302   Dziękuje, temat jest dosyć wyczerpujący. Assembler...   2.12.2011, 21:46:18
- - LSM   Jeśli chcesz to przepisać na assemblera, to nie le...   4.12.2011, 14:17:51


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: 11.10.2025 - 10:38