![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 118 Pomógł: 8 Dołączył: 10.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam, tak jak w temacie ... Wszedłem w świat OOP jakiś czas temu, teraz robię strony na Kohanie (IMG:style_emoticons/default/smile.gif) Bardzo przypadła mi do gustu ... Możecie powiedzieć mi kiedy używać dziedziczenia ? Wiem że jest to `jakby` rozdrabnianie klas ... Lecz nigdy nie mogłem znależć praktycznego zastosowania dziedziczenia w swoich skryptach (IMG:style_emoticons/default/smile.gif) Prosiłbym kogoś o takie szybkie i łopatologiczne rozpisanie jakiegoś skryptu np. newsów, artykułów czy czego kolwiek (byle nie zwierząt (IMG:style_emoticons/default/tongue.gif) ) ... Nie mówię że ma być kod tylko jak to ma wyglądać w praktyce, w formie jakiegoś drzewka lub czego kolwiek (IMG:style_emoticons/default/smile.gif)
No i jeszcze jedno .. Jak dziedziczyć w Kohanie ? Bo widzę że moje wszystkie modele i kontrolery już dziedziczą klasy wyznaczone przez Kohane (IMG:style_emoticons/default/smile.gif) _Models i _Controllers ... Da się jeszcze podpiąć coś czy nie bardzo (IMG:style_emoticons/default/smile.gif) ? Przepraszam jeżeli są to jakieś durne pytania, ale niepotrafie zastosować tego w praktyce (IMG:style_emoticons/default/smile.gif) Pozdrawiam Ten post edytował Damiankossek 24.03.2010, 14:50:44 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
Ja ostatnio zbudowałem sobie zestaw do tworzenia słowników z bazy danych w oparciu o własną warstwę abstrakcyjną do łączenia się z bazą.
Problem już wcześniej miałem rozwiązany funkcjami (funkcja do selecta, do multiselect, do checkboxa) ale jakoś mi się to nie podobało i teraz mam jeden mały zestaw: abstract.menuList.php
(na potrzeby pytania wykasowałem środek bo trochę tego jest) czyli klasa robi prawie wszystko poza odpowiednim wyglądem. A teraz dziedziczenie:
Druga klasa
Dziedziczenie jest w tym przypadku bardzo fajne bo teraz wpadłem na pomysł i chcę rozbudować te klasy o możliwość podawania tablicy z której wygenerowane zostaną słowniki a nie jak teraz tylko z bazy. Tak musiałbym przerabiać funkcje pod nowe wymagania a tak tylko przeciążenie konstruktora i pozamiatane (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#3
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Powiem w miarę prosto słowami. Dziedziczenie jest używane tam, gdzie klasa która ma powstać jest bardzo podobna do już istniejącej i wykorzystuje rozwiązania, które ona implementuje. Najczęściej używa sie go gdy owa nowa klasa rozszerza możliwości klasy starszej. Wyobraź sobie sytuację, że każde dziecko jest idealną kopią swoich rodziców i dziedziczy po nich wszystko (w php nie jest to możliwe, gdyż nie można dziedziczyć po więcej niż 1 klasie, ale to "szczegół" (IMG:style_emoticons/default/winksmiley.jpg) , przyjmij że php pozwala Ci wybrać tylko jednego rodzica do tego celu (IMG:style_emoticons/default/tongue.gif) ). Ma więc wszystkie cechy zarówno swojej matki, jak i swojego ojca (w php wszystko albo ojca, albo matki, zależnie po kim dziedziczysz), wszystkie ich zdolności + jeszcze dodaje swoje własne. Na starcie więc nie musi się niemal niczego uczyć, gdyż posiada pełną wiedzę i umiejętności obojga (jednego z) rodziców. Wszystko co jest nowe, poszerza jego umiejętności. Podobnie się ma rzecz z programowaniem. Dziedziczenie określa pewne umiejętności podstawowe, które nowa klasa "przejmuje" po rodzicu. Co ciekawe, to może dziecko owe stare metody "poprawić". Wystarczy, że funkcje owe zostaną w nowej klasie napisane na nowo. A by było jeszcze ciekawiej, dziecko może wybrać czy chce korzystać w takim wypadku z własnej metody, czy odziedziczonej po rodzicu (IMG:style_emoticons/default/smile.gif)
Nie myl dziedziczenia z implementacją. Dziedziczenie to bowiem "skopiowanie żywcem" od rodzica funkcji, metod. Implementacja określa tylko, że pewne rzeczy muszą się znaleźć w nowej klasie, ale nie mówi jak i co. To od Ciebie zależy co z tym zrobisz. Dlatego właśnie nawet nazewnictwo dziedziczenia łatwo pamiętać... jest to bowiem extends, a to po angielsku znaczy "rozszerz". To zaś w dużej mierze główne zastosowanie dziedziczenia: poszerzanie możliwości już istniejących klas bez konieczności kopiowania całego kodu na zasadzie, weź wszystko od mojego rodzica (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 118 Pomógł: 8 Dołączył: 10.12.2009 Ostrzeżenie: (0%) ![]() ![]() |
No kodzik fajny i zaczeło mi już coś świtać (IMG:style_emoticons/default/smile.gif)
Czyli w pierwszej klasie zrobiłeś sobie połączenia z bazą danych itp (IMG:style_emoticons/default/smile.gif) A w drugiej i trzeciej reszte (IMG:style_emoticons/default/winksmiley.jpg) Powiedzcie mi jeszcze jak takie coś można byłoby zastosować w Kohanie ? Czy w ogóle się da używać tam dziedziczenia (IMG:style_emoticons/default/smile.gif) ? Bo z chęcią nauczyłbym się używania tej magicznej rzeczy (IMG:style_emoticons/default/smile.gif) Pozdrawiam |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 316 Pomógł: 36 Dołączył: 2.04.2008 Ostrzeżenie: (0%) ![]() ![]() |
Tak jak kolega wyżej napisał, albo możesz sobie spojrzeć np. w manual php na klasy DOMNode i przyległe. Np. DOMDocument po niej dziedziczy - DOMNode zapewnia jakąś podstawową funkcjonalność wspólną dla każdego swojego potomka, a potomkowie dodają coś od siebie, bo np. nie było sensu żeby dana metoda znalazła się wyżej w hierarchii (w tym przypadku w klasie DOMNode), bo jest specyficzne tylko dla nich. W ten sposób każdy stworzony obiekt posiada tylko to co jest mu niezbędne. Dla programisty natomiast łatwiej jest zapamiętać że potrzebna mu metoda znajduje się np w klasie DOMElement, niż szukać jej w gąszczu metod DOMNode.
Oczywiście nie musisz wcale używać dziedziczenia, ale bardzo ułatwia ono ponowne użycie kodu. Na przykładzie obsługi plików:
Dysponujesz klasą, która posiada podstawową funkcjonalność wspólną dla każdego pliku. Teraz powiedzmy że chciałbyś do swojego skryptu, w którym używasz tej klasy dodać pewną specyficzną funkcjonalność, np. dla obrazków i plików tekstowych. Masz dla wyjścia - albo przerobić (dodać) kod klasy file i zmienić jej nazwę (dwukrotnie), albo dziedziczyć:
Kumasz? (IMG:style_emoticons/default/biggrin.gif) |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Nie myl dziedziczenia z implementacją. To tak trochę bardziej łopatologicznie:Dziedziczenie interfejsu: interfejsy Dziedziczenie interfejsu + implementacji: dziedziczenie Kiedy używać dziedziczenia? Bardzo prosto... kiedy o obiekcie klasy A możesz powiedzieć, że jest on również obiektem klasy B. O ile dobrze pamiętam na stronach Suna fajnie było to opisane: http://java.sun.com/docs/books/tutorial/ja...nheritance.html W ogóle dobrze będzie jak sobie przeczytasz: http://java.sun.com/docs/books/tutorial/ja...epts/index.html (co prawda w PHP nie ma paczek (ang. package), ale są przestrzenie nazw (ang. namespaces), które w pewnym sensie oznaczają to samo) - będziesz przynajmniej wiedział jakie są podstawowe narzędzia obiektówki. Cytat Wiem że jest to `jakby` rozdrabnianie klas To nie jest rozdrabnianie - to jest precyzowanie/wyszegóławianie (niepoprawnie to napisałem) klas.Cytat Prosiłbym kogoś o takie szybkie i łopatologiczne rozpisanie jakiegoś skryptu np. newsów, artykułów czy czego kolwiek (byle nie zwierząt Przykłady ze zwierzętami czy kształtami są bardzo dobre - ale w świecie Javy itp., a nie PHP.No to na szybko. Czym jest news i artykuł? Oba te obiekty są formą jakiegoś wpisu, które współdzielą jakieś cechy (autor, data utworzenia, treść).
Cytat ak dziedziczyć w Kohanie ? Nie znam tego FW, ale... normalnie? Poprzez extendsCytat Bo widzę że moje wszystkie modele i kontrolery już dziedziczą klasy wyznaczone przez Kohane _Models i _Controllers ... Da się jeszcze podpiąć coś czy nie bardzo ? Możesz sobie utworzyć swoją własną klasę np.: MyController, która (by silnik Kohany mógł to obsłużyć) musi dziedziczyć po _Controllers. Wtedy w niej możesz zaimplementować swoje własne metody, a kontrolery niech dziedziczą po Twojej klasie. De facto będą one dziedziczyć po MyController i _Controllers (czyli obu).
Ten post edytował Crozin 24.03.2010, 17:42:11 |
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Moja wina... Crozin zauważył moją pomyłkę (IMG:style_emoticons/default/smile.gif) Pisałem implementacja mając na myśli interfejsy (IMG:style_emoticons/default/biggrin.gif)
Co do Kohany to ja bardzo często dziedziczę w niej. Jak to wygląda? Ano choćby tak, że Kohana ma domyślnie swoją klasę Template jest ona w sumie uboga, ale udostępnia swoim potomkom wystarczająco by na jej podstawie sobie szablon główny strony utworzyć. Ten szablon, już dostosowany do moich potrzeb strony, jest z kolei podstawą, by ładnie rozpisać szablon osobny dla usera i osobny dla admina. Tworzy się więc zależność: Template Kohanowski po którym dziedziczy Template Bazowy strony. A z kolei po Template Bazowy dziedziczą template Admin i Template User. Można też zrobić dziedziczenie uprawnień choćby Klasa obsługi gościa. Rozszerza ją klasa Registered User bo ma to samo co Gość + kilka funkcji dodatkowych. Moderator dziedziczy po Userze rozszerzając o kolejne funkcje. Zaś Admin dziedziczy i rozszerza Moderatora (IMG:style_emoticons/default/smile.gif) Zauważ, że w razie czego nowe funkcjonalności "przechodzą" na klasy pochodne. Jeśli dodam coś do Gość to będą mieć to wszyscy. Jeśli dodam do Moderator, to i Admin też to otrzyma, ale już Gość i User nie, bo są "starsze". Tworzy się drzewko dziedziczenia. |
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
~Damiankossek
Praktyczne zastosowanie już znasz, teraz kolej na teoretyczny bełkot (IMG:style_emoticons/default/winksmiley.jpg) Dziedziczenie, w zależności od strony z której spojrzeć, nazywa się specjalizacją lub generalizacją. O specjalizacji mówimy gdy patrzymy na klasy "od góry", czyli od pierwszej/głównej klasy. Każda klasa, która dziedziczy po pierwszej jest specjalną odmianą rodzica. Klasa taka posiada wszystkie elementy rodzica oraz własne, specjalne, elementy. Stąd nazwa - specjalizacja. Oczywiście łańcuch dziedziczenia nie kończy się na jednej klasie. Wyspecjalizowanych klas może być więcej, np Klasa1 -> Klasa11 -> Klasa111... Generalizacja jest odwrotnością specjalizacji i polega na patrzeniu na hierarchię klas "od dołu". Czyli zaczynamy od klasy, po której nic już nie dziedziczy i przesuwamy się "do góry". W takim przypadku rodzic jest uogólnionym przypadkiem danej klasy. Innymi słowy jest to to samo, tylko ma mniejsze możliwości. Jeśli chcesz poznać więcej teorii, to poczytaj na temat diagramów klas w UML. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 31.05.2005 Ostrzeżenie: (0%) ![]() ![]() |
W "Kohanej" można stosować własne klasy w formie bibliotek więc jak najbardziej nawet mój przykład tam pasuje i wykorzystuję go na mojej stronie.
Ja podchodzę do dziedziczenia tak. Mam do napisania kilka klas robiących coś. Jeżeli 20% lub więcej kodu powtarza się w każdej klasie to znaczy, że trzeba zastosować dziedziczenie. I wywalić powtarzający się kod do rodzica (często posiadającego metody abstrakcyjne aby zachować interfejs) i potem sobie dziedziczę. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 17:52 |