![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Witam wiem ze jest to drugi watek z rzedu ale na poprzedni nikt nie udzieli mi odpowiedzi wiec chce zapytac jeszcze raz ale dokladniej:
Nie rozumiem 3 rzeczy w 100%: -Metody statyczne -Klasy i metody abstrakcyjne -interfejsy Hmm skoro OOP to OOP i powinno sie pracowac na obiektach to po co sa "statyczne" w ktorych nie tworzy sie obiektu a operuje jak na zwyklych zmiennych czy ktos moze mi wytlumaczyc jej zastosowania? I teraz klasy abstrakcyjne i implementowanie interfejsow wiem ze klasy abstrakcyjne i interfejsy to klasy ktore rozszerzaja inne klasy(jesli klasa pochodna po niej dziedziczy) czytalem tez ze klasy abstrakcyjne uzywa sie do malych projektow a interfejsy do duzycy jednak nie rozumiem jednej rzeczy: http://webcity.pl/webcity/programowanie_ob...e_w_php_5_cz__3 a dokladnie pierwszy kod z uzyciem interfejsow i jego cytat: Cytat Moglibyśmy stworzyć tutaj abstrakcyjną klasę bazową, ale wtedy uniemożliwilibyśmy programistom dziedziczenie z innych klas i tego nie potrafie zrozumiec, i jeszcze jaka jest roznica miedzy klasa abstrakcyjna i interfejsem skoro obydwie "metody" maja rozszerzac inne klasy? P.S i jeszcze jedno skoro klasy abstrakcyjne i interfejsy maja rozszerzac mozliwosci innych klas to dlaczego odrazu w takiej klasie nie mozna dac implementacji funkcji ktora ma byc potem dziedziczona/implementowana, jaki to ma sens skoro kazda klasa dziedziczaca moze miec funkcje inaczej pracujace? Ten post edytował marcio 12.09.2008, 16:08:01 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Jej, bylo z 5 razy, sa duze topiki na forum o abstr. i interfejsach.
Cytat Moglibyśmy stworzyć tutaj abstrakcyjną klasę bazową, ale wtedy uniemożliwilibyśmy programistom dziedziczenie z innych klas Klasa abstrakcyjna BEZ zaimplementowania zadnych metod to wlasciwie interfejs. Roznica polega na tym ze dziedziczyc mozez tylko po jednej klasie, a implementowac mozesz dowolna ilosc interfejsow. Dlatego w tym przypadku interfejs jest lepszym rozwiazanie,m, bo uzycie klasy abstr. nie przynosi korzysci a tylko zabiera nam mozlliwosc innego dziedziczenia. Cytat Hmm skoro OOP to OOP i powinno sie pracowac na obiektach to po co sa "statyczne" w ktorych nie tworzy sie obiektu a operuje jak na zwyklych zmiennych czy ktos moze mi wytlumaczyc jej zastosowania? No czasami nie da sie tylko niestatycznymi metodami operowac, tudziez obiektami. Poczytaj o wzorcach projektowych i zobacz jak tam z oop korzystaja, musisz jedynie wczesniej poznac polimorfizm najlepiej w jakims statycznym jezyku (c++, Java, C#) - latwiej to zalapac.
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Cytat Klasa abstrakcyjna BEZ zaimplementowania zadnych metod to wlasciwie interfejs Czyli w przypadku gdy jest tylko deklaracja funkcji jelsi dobrze rozumiem Mozesz dac jakis przyklad co do tego: Cytat Roznica polega na tym ze dziedziczyc mozez tylko po jednej klasie, a implementowac mozesz dowolna ilosc interfejsow Chodzi o to ze np w interfejsach mozna robic tak
A za pomoca klas abtr. tylko tak:
(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) Wiem ze bylo duzo razy ale nie rozumiem tego zabardzo Cytat musisz jedynie wczesniej poznac polimorfizm najlepiej w jakims statycznym jezyku (c++, Java, C#) - latwiej to zalapac. Wlasnie problem w tym ze ucze siie Cpp i zanim dojde do OOP chcialbym pojac juz OOP z php zeby mi bylo latwiej P.S czytam taki temat i chyba mniej wiecej wiem jak uzyc metody statyczne np dla klasy do obslugi mysql zamiast dziedziczyc ja w kazdej klasie ktora potrzebuje obsluge mysql mozna sie odwolywac do funckji Nazwa_klasy::metoda() Ten post edytował marcio 12.09.2008, 16:47:57 |
|
|
![]()
Post
#4
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Cytat Cytat Roznica polega na tym ze dziedziczyc mozez tylko po jednej klasie, a implementowac mozesz dowolna ilosc interfejsow Chodzi o to ze np w interfejsach mozna robic tak A za pomoca klas abtr. tylko tak: Dokladnie Cytat P.S czytam taki temat i chyba mniej wiecej wiem jak uzyc metody statyczne np dla klasy do obslugi mysql zamiast dziedziczyc ja w kazdej klasie ktora potrzebuje obsluge mysql mozna sie odwolywac do funckji Nazwa_klasy::metoda() Tez zle, nie statycznie, tylko tworzysz obiekt polaczenia a potem go przekazujesz do innych obiektow, ew. uzywasz Singletona (http://www.googlesyndicatedsearch.com/u/forumphppl?q=baza+singleton&sa=Szukaj&domains=forum.php.pl&sitesearch=forum.php.pl itp) |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
No ok a powiedz mi np co powinno sie dawac do klas abstr. albo interefejsow jakie funkcje, takie ktore sa powiazane z calym systemem?
Cytat Tez zle, nie statycznie, tylko tworzysz obiekt polaczenia a potem go przekazujesz do innych obiektow, ew. uzywasz Singletona Np chodzi ci o takie cos:
A np powiedz mi kiedy ty uzywasz metody statyczne? |
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 4 465 Pomógł: 137 Dołączył: 26.03.2004 Skąd: Gorzów Wlkp. ![]() |
Nie z całym systemem, tylko są wspólne dla pewnej grupy obiektów. Takie, które wiesz, że ich kod nie będzie zależny od konkretnego poddtypu obiektu.
Inaczej mówiąc: Jeśli jesteś pewien, że tworząc jakąś rodzinę obiektów pewne operacje będą wspólne, ale niektóre metody muszą te podklasy implementować we właściwy im sposób i muszą to robić zawsze, to opłaca się zrobić klasę abstrakcyjną. --edit Metod statycznych używasz tam, gdzie wykonujesz operacje nie związane bezpośrednio z danym obiektem (to jest ważne - obiekt posiada tożsamość), ale związane tematycznie z daną klasą lub rodziną klas. Pozdrawiam. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Hmmm czytam rozne tematy z tego forum czy taki przyklad na bazie innych ale wymyslony przez ze mnie jest wlasciwy:?
A moze cos bardziej w ten desen:
A jesli zle to jakby napisac takie cos jak zrozumialem spruboje napisac jakas klase P.S i po co jest takie cos:
Na czym polega tworzenie obiektu w funkcji? Cytat Metod statycznych używasz tam, gdzie wykonujesz operacje nie związane bezpośrednio z danym obiektem (to jest ważne - obiekt posiada tożsamość), ale związane tematycznie z daną klasą lub rodziną klas. Dalej nie rozumiem masz jakis przyklad? |
|
|
![]()
Post
#8
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
1. Interfejsy, przyklad rzeczywisty z mojego FW
Framework_Session_SessionStorage zajmuje sie zapisem i odczytem obiektu sesji, jako ze nie potrzebuje zaimplementowac tutaj zadnej metody to wystarcza mi intefrejs
pierwsza implementacja interfejsu
druga implementacja interfejsu
Ten twoj kod ostatni - skasuj i nie patrz na niego wiecej, to cos strasznego, nie ma zadnego sensu, jest bledne itd. Wybacz ze nie tlumacze czemu - ale po prostu caly kod jest bez sensu, chociaz sie kompiluje. Co do metod statycznych: Mam metody fabryczne (http://en.wikipedia.org/wiki/Factory_method_pattern ) public static function initWithEmailTemplateName($emailTemplateName){...} public static function initWithEmailTemplate(EmailTemplate $emailTemplate){...} sluzace do utworzenia nowego obiektu w rozny sposob, albo podajac obiekt, albo nazwe wg ktorej znajde sobie ten obiekt. Do tego mam prywatny konstruktor, zeby po prostu go nie uzywac, tylko wlasnie tych metod. Mozna by zrobic rozpoznawanie przekazanego parametru do konstruktora i robic to samo w konstruktorze, ale nie pamietamy jakie parametry konstruktor przyjmuje, wlaczamy podpowiadanie i widzimy __construct( $emailTemplate ) i co mozemy tam wrzucic? e? musimy zajrzec do kodu, ew. przeczytac wiecej dokumentacji zeby sie dowiedziec ze ten parametr moze przyjmowac obiekt albo stringa. Co innego w np Javie, mozesz miec 2 konstruktory, jeden przyjmuje Stringa drugi EmailTemplate. A moje metody same mi mowia jaki parametr mam podac, czy to string czy obiekt.
Albo prosta klasa z prostymi uzytkowymi funkcjami, mozna by to tez niestatycznie zrobic, ale po co, potem bedziesz mial wiecej pisania:
Albo niesmierterlny singleton
Wlasciwie to w wiekszosci te 3 typy statycznych metod mi wystarczyly. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Albo ja jestem tepy albo to jest takie "trudne".
Cytat Ten twoj kod ostatni - skasuj i nie patrz na niego wiecej, to cos strasznego, nie ma zadnego sensu, jest bledne itd. Wybacz ze nie tlumacze czemu - ale po prostu caly kod jest bez sensu, chociaz sie kompiluje. Chcesz przez to powiedziec ze pierwszy kod jest lepszy lub obydwa sa do d....? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Musze jeszcze nad tym posiedziec, znasz jakies ciekawe kursy etc ucze sie z tego z webcity i od gajdy plus ksiazka ale ciezko mi to idzie (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) . Nie rozumiem tez takiej deklaracji:
Czemu zwracasz obiekt w funkcji skoro go nie uzywasz? |
|
|
![]()
Post
#10
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
/*
Eeee, yyyy, teraz dopiero zauwazylem ze tam sa 2 kody (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Wiec, oba sa do D. Stworzenie nie moze implementowac Kot i Pies, bo to Pies i Kot sa bardziej szczegolowe (podgatunek) niz stworzenie (prosciej: znajdz mi takie COS co jest jednoczesnie psem i kotem, i jednoczesnie potrafi szczekac i mialczec) moglbys to zrobic np tak:
Kot i Pies maja to wspolnego ze potrafia "dac glos", ALE kazde z nich robi to po swojemu. I to jak robi jest w ich klasie zapisane, a nie w IF-ach Polimorfizm:
To jest zaprzeczenie OOP
tylko klasa Kot ma miec mial(), bo to inaczej nie ma sensu, po co Psu metoda mial(). Wykonales dziedziczenie na odwrot. Cytat Musze jeszcze nad tym posiedziec, znasz jakies ciekawe kursy etc Nie, ja sie uczylem z wielu ksiazek, i po hmm, 5 latach zalapalem oop (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Cytat ublic function finalizeSession( Framework_Session_Session $session ) Czego tu nie rozumiesz? Framework_Session_Session sprawdza w czasie uruchomienia czy $session jest obiektem tej klasy, dodatkowo wspomaga system podpowiadania skladni w edytorze. Cytat Czemu zwracasz obiekt w funkcji skoro go nie uzywasz? (chodzi o loadSession()) Eeee? Yyy? no przeciez uzywam, zobacz gdzie jest wywolywane loadSession(). (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Jesli chcialbym dodac do twojego kodu funkcje z mojej klasy asbtr moglbym to zrobic z jej pomoca mam racje i dawac zamiast:
Tak:
I tak implementacje funckji z klasy abtrs i tak samo dla klasy Pies? EDIT: Juz chyba lapie i wiem na czym polega moj blad, te 2 kody ktore podalem wyzej sa bledne na podstawie twojego mam 2 sposoby zeby dokonczyc klase. 1 sposob za pomoca interfejsow i klas normalnych:
2 za pomoca interfejsow i klas abstr:
Co do 2 sposobu zamiast robic interfejs funkcje dajGlos() moglem dac do klasy asbtr. opis ale to tylko przyklad z uzyciem obydwoch (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) czy juz cos zaczynam rozumiec, czy to juz lepiej wyglada od tych wczesniejszych kodow? Good? Ten post edytował marcio 13.09.2008, 20:18:44 |
|
|
![]()
Post
#12
|
|
Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Tak lepiej.
Cytat Co do 2 sposobu zamiast robic interfejs funkcje dajGlos() moglem dac do klasy asbtr Wlasnie mialem to napisac (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ze 1 klasa abtr. byla by najwlasciwsza w tym przypadku. Stworzenie z waga, wzrostem itp. |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
@Dr_bonzo czy moglbys mi podac przyklad jakiejs klasy z uzyciem klas abstr albo interefjsow taki jaki ci przychodzi do glowy a ja sproboje go napisac zobaczymy co z tego wyjdzie..
P.S plusa dam ci pozniej bo ludzie jak widza ze w temacie jest juz plus to nawet do niego nie zagladaja |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Jak widzisz zarówno rowerMiejski (tak one się nazywają? (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) ) jak i rowerGórski to rowery... mają cześć identycznych zachowań/stanów (zmiejsz predkosc, zwieksz, zahamuj, skrec/60km/h, 100obr/min) ale pod pewnymi wzgledami sie roznia. Z drugiej strony nie można stworzyć obiektu klasy rower bo każdy rower jest jakimś wyspecializowanym typem. Teraz przykład na interfejs
Ten post edytował Crozin 15.09.2008, 19:03:56 |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
W sumie kazdy z kodow powyzej mozna by napisac za pomoca klas abstr jak i interfejsow jak dobrze widze (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Jednak czy ktos moglby mi dac jakies zadanie tzn klase do napisania ja napisze i podam kod zobaczym co z tego wyjdzie wiem ze moze glupio sie zapytac o takie cos ale tak sie szybko naucze a sam nie wiem co wymyslic (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) . I czy ktos moze mi wytlumaczyc kiedy podaje sie jako argument do funkcji jakis obiekt np w tym kodzie:
Po co tak robic? |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Zawsze początkującym mówię: napisz zestaw klas do obsługi DOM (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Możesz się posłużyć JS jako "efektem docelowym" Kod var myAElement = document.createElement('a'); Dodaj do tego obsługę atrybutów i generalnie częsci (nie pisz wszystkiego - to tylko przykładowa praca ma być) tego co się przydaje przy obsłudze DOM.myAElement.setAttribute('href', 'http://php.pl'); var myDivElement = document.createElement('div'); myDivElement.appendChild(myAElement); Cytat I czy ktos moze mi wytlumaczyc kiedy podaje sie jako argument do funkcji jakis obiekt np w tym kodzie: Kiedy chcemy, aby dany argument był obiektem, który:Jest instancją wskazanej klasy i/lub dziedziczy po niej i/lub implementuje taki interfejs. |
|
|
![]()
Post
#17
|
|
Grupa: Zarejestrowani Postów: 1 085 Pomógł: 231 Dołączył: 12.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
Cytat W sumie kazdy z kodow powyzej mozna by napisac za pomoca klas abstr jak i interfejsow jak dobrze widze Niekoniecznie. A raczej nie opłaca się ich przepisywać z interfejsu na klasę abstrakcyjną czy odwrotnie.W interfejsie nie zdefiniujesz żadnej metody ani właściwości. Interface to taki zbiór metod publicznych, które klasa musi implementować, a każda z klas implementujących interface może to robić zupełnie, ale to zupełnie inaczej. W klasie abstrakcyjnej możesz jak najbardziej implementować metody (nie tylko publiczne) i nadawać właściwości. Ale oczywiście możesz tylko je inicjować, bez implementacji (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Wyobraź sobie, że na przykład masz w sprzedaży ulotki i książki. Jedno i drugie ma: czytaj() porwij() ale więcej wspólnego nie mają - zero cech wspólnych, zero metod wspólnych (w metodzie porwij dla ulotki rwiesz jedną stronę, dla książki strona po stronie, podobnie dla czytaj), mają też inne właściwości (ulotka kolor tła, a książka ilość stron). Jak byk pasuje tutaj interfejs. Ale wyobraź sobie, że zamiast ulotek masz czasopisma. Mają te same metody czytaj() porwij() te same właściwości: ilość stron cena różnią się nieznacznie (ogólnie, jednak się różnią) i nie ma sensu robić tutaj interfejsu, skoro tak samo implementują pewne rzeczy. Jak znalazł klasa abstrakcyjna, jeśli oczywiście chcesz wymusić, żeby nie można było zainicjować takiej klasy (nazwijmy ją sobie Czytadło). W końcu nie wskazuje ona na konkretny obiekt po wywołaniu (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Albo powiedzmy sobie, że mają jedną metodę xxx() którą obie muszą zaimplementować, ale implementują ją różnie - brak mi pomysłu na sensowny przykład. Wtedy metodę robisz abstrakcyjną, klasę abstrakcyjną i abstrakcja ma już sens. Czy jest sens pisać dom? Jak najbardziej. Dodałabym do tego tylko prywatną, czy też chronioną metodę do każego obiektu sprawdzającą czy jest sens zrobić appendChild (do inputa nie wciśniesz diva, w ogóle nic nie wciśniesz). Poza tym faktycznie fajne ćwiczenie. Ten post edytował Shili 15.09.2008, 21:05:15 |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat ak najbardziej. Dodałabym do tego tylko prywatną, czy też chronioną metodę do każego obiektu sprawdzającą czy jest sens zrobić appendChild (do inputa nie wciśniesz diva, w ogóle nic nie wciśniesz). Poza tym faktycznie fajne ćwiczenie. Generalnie ja bym proponował zrobić:
|
|
|
![]()
Post
#19
|
|
Grupa: Zarejestrowani Postów: 1 085 Pomógł: 231 Dołączył: 12.05.2008 Ostrzeżenie: (0%) ![]() ![]() |
Proponowałam prywatną ze względu na jedno z rozróżnień interfejsu z klasą abstrakcyjną. Oczywiście, jak najbardziej się zgadzam z zaprezentowanym rozwiązaniem, jednak w przypadku metody chronionej, tudzież prywatnej marcio by własnoręcznie zobaczył, że jednak nie każdą klasę abstrakcyjną da się zamienić na interfejs. Tego aspektu zabrakło mi osobiście w tym temacie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) chociaż przyznam, że jak najbardziej mogłam coś przeoczyć (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Ten post edytował Shili 15.09.2008, 21:35:53 |
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Ok dzieki ze mi tak tlumaczycie jestescie na medal jednak nie znam js i szczerze mowiaz nigdy nie interesowalem sie dom moze jednak cos innego moglbym napisac?
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 17:15 |