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





Grupa: Zarejestrowani
Postów: 664
Pomógł: 169
Dołączył: 8.01.2010
Skąd: Kraków

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


Zgadzam się z LSM, że myślenie 'na przyszłość' jest zgubne, ale pod warunkiem, że rozważasz rozwiązania, które przypuszczasz, że kiedyś, może zostaną zaimplementowane. Wtedy nie implementujesz setek wzorców itp. tylko po to, żeby można było zrobić z tym wszystko, co ci się żywnie podoba, tyle, że w przyszłości, implementując rzeczy, których możesz nigdy nie implementować, ponieważ twoje przewidywania były błędne.
Co do rozwiązania Crozina, to nie jest ono 'nad wyrost', robienie czegoś poprawnie, nie jest wprowadzaniem nadmiernej elastyczności.

Co do klasy Damian, to:
Z wikipedii:
Cytat
W programowaniu obiektowym klasa jest częściową lub całkowitą definicją dla obiektów. Definicja obejmuje dopuszczalny stan obiektów oraz ich zachowania.

i mamy dalej:
Cytat
Klasa nie jest samodzielnym bytem, lecz szablonem do tworzenia nowych obiektów określonego typu i posiadających określone zachowanie.[...]Poszczególne instancje klasy posiadają ten sam zbiór zachowań i atrybutów, lecz różnią się przechowywanymi w nich wartościami.[...]


Czyli klasa definiuje atrybuty i zachowanie obiektów, ale dopiero przy ich tworzeniu określamy ich stan.
Rozumiem, że klasa Damian dziedziczyłaby po klasie Człowiek tyle, że ustawiałaby jakieś domyślne wartości, tak? No to się to trochę kłóci z powyższymi.

Programowanie obiektowe zostało wymyślone w celu jak najdokładniejszego odwzorowania rzeczywistości.
Załóżmy więc, że Damian to model. W takim wypadku, czym są jego instancje? Damian1, Damian2 itp.? Nawet jeżeli każdy Damian jest rudy, sympatyczny i nieprzeciętnie inteligenty, to czy oznacza to, że mamy do czynienia z nowym człowiekiem? Wątpię(IMG:style_emoticons/default/smile.gif)

Jeżeli już koniecznie chcesz robić coś takiego, to możesz stworzyć jakąś fabrykę, która zwraca ci obiekt klasy Człowiek z odpowiednimi ustawieniami (czyli umiejętnościami, imieniem, IQ i wszystkim innym, co tylko chcesz).
Takie samo rozwiązanie zastosowałbym do przykładu, który przedstawił Orzeszekk (z klasą AvatarUploader). Tutaj też rozwiązaniem byłaby fabryka.
Bo tworzenie dziedziczenia tylko i wyłącznie po to, żeby klasy od razu miały ustawiony szereg odpowiednich wartości jest bez sensu i nie jest poprawne, nie ważne czy uczy tego Duńczyk, Holender, Polak, czy wiesz to z tutoriali. Bo w takim wypadku dojdziesz do skrajności, gdzie dla każdego zestawu danych będziesz miał osobny obiekt?

Dziedziczenie powinno rozszerzać funkcjonalność i wtedy ma ono sens. Jeżeli służy tylko do ustawiania wartości, 'bo taki zestaw danych jest często używany' tzn. że mamy do czynienia z błędnym rozumieniem dziedziczenia.

A co do pytania głównego, to tutaj pisałem trochę na temat tego, kiedy interfejs a kiedy klasa abstrakcyjne. W Twoim wypadku, uwzględniając tylko te informacje, które przekazałeś i nic więcej (bez przypuszczeń), to interfejs jest Ci nie potrzebny, wszystko ląduje w klasie abstrakcyjnej.
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: 8.10.2025 - 01:02