Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziedziczenie.
Forum PHP.pl > Forum > PHP > Object-oriented programming
Milczar
Witam.
Mam klase, która ma metody:
Kod
class A{
    private function pryw()
    {
      print("<br>PRYWATNA<br>");
    }

    public function accesspryw()
    {
      $this->pryw();
    }
}

oraz ma inne metody publiczne. Metody accesspryw() potrzebuje by korzystac z metody pryw() wywolujac ją z obiektu klasy A.
Kolejna klasa 'B' dziedziczy po klasie A.
Kod
class B extends A {
//i jakies inne metody klasy B
}

Pytanie następujące: Czy klasa B będzie miała dostęp do metody pryw() z klasy A (poprzez metode accesspryw() )? Chyba nie powinna jej dziedziczyć po klasie A bo w klasie A metoda pryw() jest prywatna, tak? Wywołanie accesspryw() z obiektu klasy B powinno dac (błąd dostępu do metody prywatnej/błąd niezdefiniowanej metody)?

Pozdrawiam i z góry dzięki za odpowiedź.
devnul
obie metody zostaną odziedziczone po klasie A używanie pivate jak i public ma na celu uniemożliwienie dostępu do pewnych metod i zmiennych z zewnątrz klasy (po jej zainicjalizowaniu)
Milczar
W takim razie przykład zmiennych.
W klasie A sa zmienne typu private i public, oraz funkcja publiczna, która je wszystkie wyświetla.
Klasa B dziedziczy po klasie A zmienne i funkcje wyświetlającą wartości zmiennych.
Wywołanie funkcji wyswietlajacej wartosci zmiennych z klasy B, powoduje że wyswietlane są tylko zmienne PUBLIC. Czyli funkcja publiczna (wywolana z B), widzi tylko skladowe publiczne klasy-matki ('A'). Czy nie powinno być analogicznie z metodami? (metody private niewidoczne zupelnie w klasie 'B').
Pozdrawiam.
sf
NIE. Bo korzystasz w tym przypadku z funkcji publicznej, ktora jest zdeklarowana w klasie A, a ona ma mozliwosc korzystac z metod/zmiennych prywatnych.

  1. <?php
  2.  
  3. class A
  4. {
  5.  private function pryw()
  6.  {
  7.  echo "private";
  8.  }
  9.  
  10.  public function accesspryw()
  11.  {
  12.  $this->pryw();
  13.  }
  14. }
  15.  
  16. class B extends A
  17. {
  18. public function life()
  19. {
  20. $this->pryw();
  21. }
  22. }
  23.  
  24. $oB = new B();
  25. $oB->accesspryw(); // to zadziala
  26. $oB->life(); // to juz nie zadziala
  27.  
  28.  
  29. ?>
Milczar
Czyli defacto klasa potomna dzidziczy metody private, tak?
Czemu w takim razie nie dziedziczy zmiennych private?

Gdy mam zadeklarowane w klasie A zmienne i metode:
Kod
public      $I;
private      $L;
public      $M;
public      $T;

    public function test()
    {
      print("ID=".$this->I."<br>");
      print("LOGIN=".$this->L."<br>");
      print("MAIL=".$this->M."<br>");
      print("TYPE=".$this->T."<br>");
    }


Elementy te sa dziedziczone przez klase B. Po wywolaniu metody test() z obiektu klasy A, wyswietlane sa wszystkie zmienne (wartosci), po wywolaniu test() z obiektu klasy B nie ma wartosci zmiennej $L - nie widzi jej bo jest private. Jaka roznica miedzy zmiennymi a metodami?


Jest na to jakieś obejscie? Zeby metody private nie byly wogole widoczne w klasach potomnych?

A co z protected? tak samo?

Pozdrawiam
devnul
Cytat
Czyli defacto klasa potomna dzidziczy metody private, tak?
Czemu w takim razie nie dziedziczy zmiennych private?


o to by trzeba było zapytać twórców php
Ludvik
Metody prywatne nie są dziedziczone w tym przypadku. Zauważ, że nie przeciążyłeś metody accesspryw(), która jest metodą klasy A, więc ma prawo dostępu do prywatnej metody pryw(). Gdybyś zmienił dostęp do metody pryw() na chroniony, to by była dostępna bezpośrednio z wnętrza klasy B. Sytuacja jest jak najbardziej prawidłowa i zmienne są objęte tymi samymi prawami.

Ogólnie jest tak:
Private - widoczna tylko z wnętrza klasy definiującej.
Protected - widoczna z wnętrza klasy definiującej i dziedziczących.
Public - widoczna z każdego miejsca.
dr_bonzo
Klasa potomna NIE dziedziczy metod (i zmiennych) prywatnych (odsylam do manuala z objecnieniem modyfikatora private) -- dziedziczy jedynie metody (i zmienne) publiczne i chronione -- czyli tak jak pisal sf

Milczar
Cytat
Pytanie następujące: Czy klasa B będzie miała dostęp do metody pryw() z klasy A (poprzez metode accesspryw() )? Chyba nie powinna jej dziedziczyć po klasie A bo w klasie A metoda pryw() jest prywatna, tak? Wywołanie accesspryw() z obiektu klasy B powinno dac (błąd dostępu do metody prywatnej/błąd niezdefiniowanej metody)?


Klasa B dziedziczy po A: accesspryw()
NIE dziedziczy: pryw()

accesspryw() jest wykonywana na 'poziomie' klasy A (bo niezostala przedefiniowana w cool.gif i ma dostep do wszystkich pol i metod klasy A.
Milczar
Jak to przeciazenie ma wygladac?
Moim celem jest zeby pryw() nie byla dostepna w B.
devnul
Cytat
Jak to przeciazenie ma wygladac?
Moim celem jest zeby pryw() nie byla dostepna w B.

Jeśli taki jest Twój cel to właśnie tak działą Twój kod przedstawiony na początku tego wątku. Czyli problemu nie było a jedynie źle sformułowane pytanie winksmiley.jpg
Milczar
Byc moze teraz cos zle sformulowalem.
W moim kodzie pryw() jest dostepna z B przez accesspryw() - chce zeby NIE byla przez nia dostepna. (ani w zaden inny sposob - pryw() z obietu klasy B nie istnieje).
Ludvik
Sama metoda pryw() nie jest widoczna w B, bo nie została odziedziczona. Sam stworzyłeś metodę dostępową accesspryw(). Musisz po prostu przeciążyć ją w jakiś logiczny sposób. Możesz wyrzucić na przykład wyjątek.

  1. <?php
  2. class B extends A {
  3. public function accesspryw() {
  4. throw new Exception();
  5. }
  6. }
  7. ?>


Tak czy innaczej nie przepadam za takimi rozwiązaniami.
Milczar
Czy w takim razie jest jakiś sens robienia metod private, skoro aby ich uzyc trzeba utworzyc publiczna metode dostępową? Przeciez pozniej dziedziczac po klasie matce (A) w ktorej jest metoda private i dostepowa, metoda dostepowa jest dziedziczona co daje dostep do metody private klasy A obiektowi klasy potomnej. I czemu tak nie ma w zmiennych (metoda dostepowa wywolana z potomka nie ma dostepu do zmiennych private klasy rodzica)? Wiem ze moze pytam ktorys juz raz o to samo ale dalej jest to dla mnie troche dziwne.
dr_bonzo
Cytat
Czy w takim razie jest jakiś sens robienia metod private, skoro aby ich uzyc trzeba utworzyc publiczna metode dostępową?

Uzyc skad?
- z tej samej klasy -- przeciez mozesz
- z innej klasy -- to po co deklarowales ja jako prywatna?

Cytat
Przeciez pozniej dziedziczac po klasie matce (A) w ktorej jest metoda private i dostepowa, metoda dostepowa jest dziedziczona co daje dostep do metody private klasy A obiektowi klasy potomnej.

Jesli ta metoda dostepowa byla utworzona to byla do czegos POTRZEBNA, wiec najlepiej przemysl interfejsy klas i hiearchie dziedziczenia ponownie.

Cytat
metoda dostepowa wywolana z potomka nie ma dostepu do zmiennych private klasy rodzica

Bo nie ma, jak chcesz zeby miala to zadeklaruj je jako protected.
Milczar
Cytat(dr_bonzo @ 2006-04-20 15:55:44)
Cytat
Czy w takim razie jest jakiś sens robienia metod private, skoro aby ich uzyc trzeba utworzyc publiczna metode dostępową?

Uzyc skad?
- z tej samej klasy -- przeciez mozesz
- z innej klasy -- to po co deklarowales ja jako prywatna?

Cytat
Przeciez pozniej dziedziczac po klasie matce (A) w ktorej jest metoda private i dostepowa, metoda dostepowa jest dziedziczona co daje dostep do metody private klasy A obiektowi klasy potomnej.

Jesli ta metoda dostepowa byla utworzona to byla do czegos POTRZEBNA, wiec najlepiej przemysl interfejsy klas i hiearchie dziedziczenia ponownie.

Cytat
metoda dostepowa wywolana z potomka nie ma dostepu do zmiennych private klasy rodzica

Bo nie ma, jak chcesz zeby miala to zadeklaruj je jako protected.

1 Nie moge z tej samej klasy uzyć metody private. Moge ją użyć tylko przez metode dostępową. -> http://forum.php.pl/index.php?showtopic=39...=0&#entry219307
A deklarowalem jako private wlasnie po to zeby z potomnej klasy nie mozna bylo jej uzyc, zeby byla niewidoczna dla potomnej wogóle.

2 Metoda dostepowa byla utworzona wlasnie po to zeby mozna bylo uzyc protected z klasy w której jest zdefinowana.

3 Jeśli chodzi o zmienne to to jest wlasnie dla mnie logiczne. Private jest niewidoczne dla potomka i niewazne czy jest jakas metoda publiczna dostepowa. One po prostu dla potomnka nie istnieja. I tak samo chyba powinno byc z metodami.
dr_bonzo
Po co cytujesz CALY post ktory znadjude sie TUZ NAD twoim?


Cytat
3 Jeśli chodzi o zmienne to to jest wlasnie dla mnie logiczne. Private jest niewidoczne dla potomka(...)

I kropka -- to co robia metody dostepowe to inna sprawa.
Metody prywatne nie sa dostepne dla potomkow, publiczne/chronione sa - i znow kropka. To do czego te metody sie odwoluja (do prywatnej metody nadklasy) to inna sprawa.


  1. <?php
  2. class A{
  3.  private function pryw()
  4.  {
  5.  print("<br>PRYWATNA<br>");
  6.  }
  7.  
  8.  public function accesspryw()
  9.  {
  10.  $this->pryw();
  11.  }
  12. }
  13.  
  14. class B extends A {
  15. }
  16.  
  17. $b = new B();
  18. $b->accesspryw(); // jako ze nie przedefiniowales jej w klasie B to ta metoda jest wywolywana
  19. // z poziomu klasy A (polimorfizm) wiec na dostep do prywatnej metody klasy A (pryw())
  20.  
  21. ?>


tyle
em1X
Po 1: metody prywatne nie są dziedziczone.

Jaki jest sens robienia czego takiego: (no chyba, ze tylko dla celow naukowych)
  1. <?php
  2.  
  3. class A {
  4.  private function pryw() {
  5. echo "pryw";
  6. }
  7.  
  8.  public function publ() {
  9. $this -> pryw();
  10. }
  11. }
  12.  
  13. ?>


private uzywasz tylko wtedy, gdy chcesz ukryc metody przed dostepem z zewnatrz (jakies metody niezbedne do dzialania akurat tej klasy itp..)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.