![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 999 Pomógł: 30 Dołączył: 14.01.2007 Skąd: wiesz ? Ostrzeżenie: (0%) ![]() ![]() |
Jak teraz w metodzie test() przenieść dane do obiektu dziecka? Wiem że mógłbym zadeklarować te zmienne jako protected, ale nie chcę. Dodatkowo nawet jakbym tak zrobił to bym i tak musiał je przepisywać ręcznie, bo klasa A implementuje Iterator i foreach($this) nie da mi dostępu do zmiennych składowych. Istnieje może jakaś metoda na kopiowanie tego czy muszę klepać wszystkie zmienne? |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
To co robisz mija się z ideą dziedziczenia w programowaniu obiektowym. Skoro klasa B rozszerza klasę A, to znaczy, że w klasie B mamy takie same pola i metody, jak w klasie A. Przykład:
Pozostaje pytanie, dlaczego w klasie B nie mamy dostępu bezpośredniego do pól $zmienna_a i $zmienna_b. Otóż dlatego, że są to pola prywatne (private) klasy A, zatem dostęp do nich jest możliwy tylko z publicznej metody w tej właśnie klasie A. Dodam jeszcze jeden przykład: Aby zachować paradygmaty dziedziczenia i hermetyzacji danych, należałoby wykorzystać modyfikator dostępu protected. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 999 Pomógł: 30 Dołączył: 14.01.2007 Skąd: wiesz ? Ostrzeżenie: (0%) ![]() ![]() |
No świetnie wiem tylko co jeśli do jednego pola składowego nie chcę robić publicznego gettera i setter, bo jest ono wykorzystywane wewnątrz klasy dziecka? A tak właśnie jest. Z kolei zrobienie chronionego settera i gettera nie różni się zbytnio od zadeklarowania tego pola jako chronionego.
edit> Właściwie miałem nadzieję że istnieje coś w stylu clone. np.
Ten post edytował starach 24.04.2010, 08:26:18 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Istnieje. Tyle że nie copy, a clone.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
Jak teraz w metodzie test() przenieść dane do obiektu dziecka? Wiem że mógłbym zadeklarować te zmienne jako protected, ale nie chcę. Dodatkowo nawet jakbym tak zrobił to bym i tak musiał je przepisywać ręcznie, bo klasa A implementuje Iterator..... wszystko zależy jak......i foreach($this) nie da mi dostępu do zmiennych składowych. jak nie jak tak o.0Object Iteration
Kod object(B)#1 (2) { ["zmienna_a":"A":private]=> string(1) "A" ["zmienna_b":"A":private]=> string(1) "B" } w pierwszej kolejności musiałbyś doprecyzować o co Ci dokładnie chodzi... za czorta ciężko zrozumieć ten temat... |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Jesli cie dobrze zrozumialem mozesz robic takiego hack'a: http://blog.zabiello.com/2009/06/21/zabezp...java-scala-php5
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 999 Pomógł: 30 Dołączył: 14.01.2007 Skąd: wiesz ? Ostrzeżenie: (0%) ![]() ![]() |
~marcio: Ta wiem że takie sztuki można dzięki Reflection robić, ale aż takim hardkorem nie jestem. (IMG:style_emoticons/default/tongue.gif)
~zegarek: Zrozumiałeś mnie prawie dobrze. Klasa rodzic implementuje Iterator na jednym ze swoich pól składowych, które notabene jest tablicą, więc nie mogę wykonać na nim iteracji przez $this, bo inaczej klucze nie będą nazwami zmiennych klasy tylko kluczami tej tablicy. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 1 332 Pomógł: 294 Dołączył: 12.10.2008 Skąd: Olkusz Ostrzeżenie: (0%) ![]() ![]() |
~zegarek: Zrozumiałeś mnie prawie dobrze. Klasa rodzic implementuje Iterator na jednym ze swoich pól składowych, które notabene jest tablicą, więc nie mogę wykonać na nim iteracji przez $this, bo inaczej klucze nie będą nazwami zmiennych klasy tylko kluczami tej tablicy. ok.. to sprawdź jak tutaj zachowa się funkcja get_object_vars - powinna być odporna na iterator ale szczerze nie wiem a tylko na chwilę teraz zajrzałem na forum... czyli przykład wyżej zamień metodę na:
i jeśli zadziała (bez iteratora działa) to masz rozwiązanie i dostosujesz do swoich potrzeb... jeśli to nie zadziała to chyba będziesz musiał przy setterze czy jakkolwiek ustawiasz wartości składować nazwy w jakiejś tablicy... Ten post edytował zegarek84 24.04.2010, 14:31:02 |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 999 Pomógł: 30 Dołączył: 14.01.2007 Skąd: wiesz ? Ostrzeżenie: (0%) ![]() ![]() |
Zapomniałem odpisać. Dzięki zegarek o to chodziło. Zupełnie zapomniałem o tej funkcji.
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 6.10.2025 - 17:27 |