Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa publiczna ale tylko dla niektorych klas
Forum PHP.pl > Forum > PHP > Object-oriented programming
Orzeszekk
Zalozmy ze mam jakis obiekt Obiekt i drugi obiekt ObiektSterujacy.

chce by ObiektSterujacy mogl wywolac metode obiektu Obiekt->zmienCostam() i cos w nim zmienic, ale zeby tylko obiektSterujacy mogl wywolac ta metode. Dla klasy KlasaPoboczna metoda zmienCostam powinna byc chroniona.

Czy jest jakis inteligentny sposob na zrealizowanie tego ? w tym momencie jedyną rzeczą jaka mi przychodzi do glowy jest przesylac instancje obiektu ObiektSterujacy i w obiekcie Obiekt sprawdzac czy to instancja ObiektSterujacy. Jednak to nieeeleganckie niewygodne i niepotrzebny narzut.
Crozin
W PHP nie da się w żaden sposób określić poziomu dostępności klasy. Niestety wszystkie są publiczne. Tak więc na poziomie języka nic nie zdziałasz, jedynie w dokumentacji możesz to zaznaczyć.
by_ikar
Ewentualnie możesz jeszcze się pobawić w instanceof, tyle że według mnie trochę to bez sensu i takie tworzenie obiektów idiotoodpornych, które mogą być użyte tylko w taki sposób jaki tego chcemy. IMO zbyteczna funkcjonalność wink.gif
Orzeszekk
Widocznosc klasy mnie nie obchodzi, klasa moze byc widoczna i publiczna.

chce zebym mogl ukryc niektore metody klasy przed niektorymi klasami. chcialem zrobic ładne idiotoodporne klasy smile.gif zeby wszyscy mogli np odczytac dana wartosc ale tylko jedna klasa sterujaca nadrzedna mogla uzyc settera zeby cos do niej zapisac.

No bo tak to po co mi getter i setter jak oba maja byc publiczne
Crozin
PHP nie udostępnia też niczego co mogłoby działać jak metody zaprzyjaźnione czy dostępność po przestrzeni nazw. Jedyne kryterium widoczności metod to hierarchia klas.
Cytat
No bo tak to po co mi getter i setter jak oba maja byc publiczne
To jest raczej normalne że jeżeli istnieje setter, to jest on publiczny.
by_ikar
Cytat(Orzeszekk @ 19.11.2011, 18:28:50 ) *
Widocznosc klasy mnie nie obchodzi, klasa moze byc widoczna i publiczna.

chce zebym mogl ukryc niektore metody klasy przed niektorymi klasami. chcialem zrobic ładne idiotoodporne klasy smile.gif zeby wszyscy mogli np odczytac dana wartosc ale tylko jedna klasa sterujaca nadrzedna mogla uzyc settera zeby cos do niej zapisac.

No bo tak to po co mi getter i setter jak oba maja byc publiczne


No to tak jak mówię, instanceof i jazda. Niech powiedzmy twój seter przyjmuje jako parametr jakiś inny obiekt, wówczas wywali błąd jeżeli przekażesz wartość z zupełnie innego obiektu.

  1. <?php
  2.  
  3. class Foo
  4. {
  5. private $options;
  6.  
  7. public function setValue(Bar $val)
  8. {
  9. $this->options = $val->options;
  10. }
  11.  
  12. public function getValue($val)
  13. {
  14. //..
  15. }
  16. }
  17.  
  18. class Bar
  19. {
  20. protected $options;
  21. public function __construct($options)
  22. {
  23. $this->options = $options;
  24. }
  25. }
  26.  
  27. $foo = new Foo();
  28. $foo->setValue(new Bar('some value'));


lub wersja z instanceof:

  1. <?php
  2.  
  3. class Foo
  4. {
  5. private $options;
  6.  
  7. public function setValue($val)
  8. {
  9. if($val instanceof Bar)
  10. {
  11. //..
  12. } else
  13. {
  14. //.. tutaj mozesz sobie rzucic wyjątkiem
  15. }
  16.  
  17. }
  18.  
  19. public function getValue($val)
  20. {
  21. //..
  22. }
  23. }
  24.  
  25. class Bar
  26. {
  27. protected $options;
  28. public function __construct($options)
  29. {
  30. $this->options = $options;
  31. }
  32. }
  33.  
  34. class Test
  35. {
  36.  
  37. }
  38.  
  39. $foo = new Foo();
  40. $foo->setValue(new Test('some value'));


Coś w tym stylu. Gdzieniegdzie taka funkcjonalność się przydaje, ale raczej nie do tego żeby zrobić klasę idioto odporną, tylko przykładowo do polimorfizmu.
Crozin
@by_ikar: Tu nie chodzi o typ argumentu, a o samo wywołanie metody. W PHP nie osiągnie tego czego oczekuje.
by_ikar
Tak, tak, wiem to, napisałeś to, nie chciałem tego samego powtarzać już wink.gif jedynie chciałem mu uświadomić że to zbędna funkcjonalność jeżeli by coś takiego chciał osiągnąć poprzez właśnie typ argumentu.
Orzeszekk
No coz dobrze ze istnieje chociaz php doc w ktorym sobie mozna napisac gdzie czegos wolno uzywac a gdzie nie.
Crozin
A może opisałbyś swoją sytuację bardziej precyzyjnie? Może da się to jakoś ładniej rozwiązać, na poziomie języka.
Orzeszekk
Chce zeby klasa Item_Object mogla miec zmienione parametry tylko podczas tworzenia oraz edycji parametrow w widoku edycji, a zeby przypadkowe uzycie settera np podczas obliczen gdzies tam w modelach bylo zabronione.

A jak juz jestesmy przy slabosciach jezyka, da sie jakos zmusic php by nie trzeba bylo pisac $this odwolujac sie do pól klasy?

chcialbym zeby bylo tak jak w javie

  1. klasa X{
  2. public $field;
  3. public function C{
  4. $field=x;
  5. }
  6. }


ew jesli nie ma takie dyrektywy to moze chociaz jakas instrukcja grupujaca with (jak ta w pascalu)
  1. with ($this)
  2. {
  3. $field=3; //$this->field = 3
  4. }

jak sie robi obliczenia na duzej ilosci pól to potrafi ten $this dobic
Crozin
Cytat
Chce zeby klasa Item_Object mogla miec zmienione parametry tylko podczas tworzenia oraz edycji parametrow w widoku edycji, a zeby przypadkowe uzycie settera np podczas obliczen gdzies tam w modelach bylo zabronione.
Takie coś w pewnych językach (ot, chociażby wspomnianej Javie) na "dziko" dałoby się pewnie osiągnąć, ale raczej nie powinieneś czegoś takiego robić. Obiekt powinien mieć swój publiczny interfejs, który powinien być niezależny od miejsca użycia. Jeżeli ktoś chce użyć settera to i tak go użyje (patrz: Reflection), co więcej na pewno zrobi to świadomie.

Cytat
A jak juz jestesmy przy slabosciach jezyka, da sie jakos zmusic php by nie trzeba bylo pisac $this odwolujac sie do pól klasy? [...]
Zawsze musisz poprzedzać do "$this->". Zresztą... to na prawdę nie jest jakiś problem czy udręka.
Orzeszekk
  1. $result = $this->getUploader() . ' = new ' . $this->getClassName() . '('
  2. . $this->getFieldConstant() . ' );<br>' . $this->getPhotoEntry() . '= '
  3. . $this->getUploader() . '->upload ();<br>';


  1. $result = getUploader() . ' = new ' . getClassName() . '('
  2. . getFieldConstant() . ' );<br>' . getPhotoEntry() . '= '
  3. . getUploader() . '->upload ();<br>';


kwestia dyskusyjna z tym $this, ja tego nie lubie. Zresztą czesto o nim zapominam pisząc co powoduje czasem trudne do znalezienia błędy.

nie chodzi o to by tak naprawde na chama zabezpieczyc, wiadomo ze ktos moze uzyc reflection, ale chodzi mi o to by omyłkowo nie uzyc settera tam gdzie sie tego robic nie powinno. a jak ktos bedzie chcial swiadomie to to zrobi, nawet kod sobie moze przerobic przeciez.
by_ikar
No wiesz co, to są aż 4 znaki, z czego do dolara trzeba użyć shifta dodatkowo. Nie wiem jak jest w innych językach, ale podejrzewam że jest podobnie, bo niby skąd interpreter/kompilator ma wiedzieć że metoda do której się odnosisz pochodzi właśnie do tego obiektu, a nie obiektu który dziedziczysz?

Cytat
nie chodzi o to by tak naprawde na chama zabezpieczyc, wiadomo ze ktos moze uzyc reflection, ale chodzi mi o to by omyłkowo nie uzyc settera tam gdzie sie tego robic nie powinno. a jak ktos bedzie chcial swiadomie to to zrobi, nawet kod sobie moze przerobic przeciez.


No właśnie, jak będzie chciał to i tak użyje, a po co tworzyć jakąś niepotrzebną funkcjonalność, która jest zbędnym narzutem wydajnościowym.

Możesz bawić się w method chaining, i wtedy raz zapisać this:

Kod
$this->select()->from('table')->where('condition')->order('column asc')->limit(5);


itd. Póki co nie przeszkadza mi wpisywanie this, wystarczy że wewnątrz obiektu wstawię dolara i już mam listę zmiennych dostępnych w klasie/metodzie i na pierwszym miejscu zawsze mam this, strzałka w dół i od razu dostaje $this->. Kwestia edytora, kwestia snippetów i kwestia przyzwyczajenia wink.gif
Crozin
Cytat
nie chodzi o to by tak naprawde na chama zabezpieczyc, wiadomo ze ktos moze uzyc reflection, ale chodzi mi o to by omyłkowo nie uzyc settera tam gdzie sie tego robic nie powinno. a jak ktos bedzie chcial swiadomie to to zrobi, nawet kod sobie moze przerobic przeciez.
Nie da się w żaden sposób zabezpieczyć przed błędnym używaniem jakiegoś kodu. Nie na poziomie języka. Raczej powinieneś sobie to darować i co najwyżej w dokumentacji dobrze opisać jak powinno się korzystać, czemu tych przykładowych setterów nie powinno używać się tam i tam itd.

Cytat
Nie wiem jak jest w innych językach, ale podejrzewam że jest podobnie, bo niby skąd interpreter/kompilator ma wiedzieć że metoda do której się odnosisz pochodzi właśnie do tego obiektu, a nie obiektu który dziedziczysz?
To akurat nie jest żadnym problemem. Problemem jest to, że PHP jako język wieloparadygmatowy ma coś takiego jak funkcje globalne. Wymuszenie stosowania każdorazowo $this było najlepszym rozwiązaniem by uniknąć "niestandardowej" (względem innych języków) składni oraz dwuznacznego kodu.
Orzeszekk
by_ikar:

w javie z tego co pamietam jest tak ze jak zrobisz zmienna lokalną mającą tą samą nazwę co pole to ta zmienna lokalna przysłania
widocznością pole w klasie. Wtedy do pola możesz się odwołać za pomocą this.pole. Jak widać również jest operator this, lecz korzysta
się z niego tylko gdy jest potrzebny. Zresztą w javie zazwyczaj zapisuje sie wtedy nazwe zmiennej lokalnej z podkreślnikiem z przodu lub z tyłu.

W C# i Pascalu/Delphi jest tak samo i uwazam to za duzo bardziej naturalne podejscie do tematu. W C++ nie wiem jak jest, podejrzewam ze podobnie jak w PHP bo tworcy PHP sami by raczej na to nie wpadli. Sorry, pojechałem na wymiane w tym semestrze kiedy mialem C++ a na codzien to język kompletnie nieprzydatny mi jak na razie więc go nie znam.

No i w pascalu na pewno są funkcje globalne i również nie jest to żadną przeszkodą, natomiast w Javie i C# jako językach obiektowych od początku już chyba tego nie ma.

Crozin to nie cztery znaki a 7:
  1. $this->


widzisz? 7.

W tym operator -> będący najbardziej durnym operatorem jaki kiedykolwiek na oczy widziałem. Jak mozna operator uzywany miliony razy w kodzie zrobić z dwóch znaków, w tym jeden wymagający nacisniecia shift? Kropka jest do tego znacznie lepsza i gdyby była nakładka na php pozwalająca na uzywanie . zamiast ->, oraz + zamiast . (operatora konkatenacji stringow ktory jest niezbyt intuicyjny, plus jest lepszy) to bym chetnie z takiej nakładki korzystał biggrin.gif

Byc moze byloby za duzo błędów logicznych gdyby zrobili bez obowiązkowego $this, bo twórcy nie pomysleli o deklarowaniu zmiennych.
głupie var $zmienna uratowałoby wiele programistów przed marnowaniem czassu na debugowanie literówek.

W zasadzie samo this nie jest problemem, problemem jest zapisanie tego durnego dolara i -> bo to te znaki sprawiaja ze nieprzyjemnie sie to pisze. Problemem w cudzyslowie oczywiscie bo jestem zdrowy nie jestem uposledzony i jestem w stanie to napisac, jednak troche mi to przeszkadza bo jest to niewygodne.

klasyczny przykład kiedy uproszczenie stało się utrapieniem biggrin.gif

Ja błagam stwórcę o to by zrobili świetne Mono na linuksa i wtedy wszystkie hostingi dodadzą opcje hostowania asp.net w cenie PHP
i będzie wreszcie mozna tworzyc strony w normalnym języku.


--------------------------------
zainspirowany postem by_ikar zmienilem w eclipse timeout podpowiadania skladni z 30 ms na 0 ms i faktycznie po wpisaniu
$t wyskakuje samo $this->, i nie trzeba naciskac ctrl + spacji. troche to ulatwia


method chaining - inspiracja z symfony? Wole nie wiedziec jak to wplywa na wydajnosc w takim jezyku jak PHP, bo wygladac to moze i wyglada fajnie..
by_ikar
Cytat
method chaining - inspiracja z symfony? Wole nie wiedziec jak to wplywa na wydajnosc w takim jezyku jak PHP, bo wygladac to moze i wyglada fajnie..


yy to nie jest inspiracja z symfony, akurat symfony i wiele innych FW, jak i klas to wykorzystuje. Jak wpływa na wydajność? Dokładnie ci nie powiem, ale wydaje mi się że to jest bez różnicy. Mam taki swój powiedzmy framework, w którym kilka obiektów korzysta z method chaining (sklejanie zapytań do bazy, paginator i coś by się jeszcze znalazło), a mimo to wyświetlenie podstrony (zalogowany użytkownik, jakieś 10 zapytań do bazy, szablon, jakieś dodatkowe pierdoły) a strona nie generuje się powyżej 400ms zużywając średnio 2-3mb.

Cytat
zainspirowany postem by_ikar zmienilem w eclipse timeout podpowiadania skladni z 30 ms na 0 ms i faktycznie po wpisaniu
$t wyskakuje samo $this->, i nie trzeba naciskac ctrl + spacji. troche to ulatwia


Nie wiem jak jest w eclipse, bo z niego nie korzystam, ale u siebie w phpdesigner wystarczy że wstawię dolara i już mam listę zmiennych które mogę użyć.
Orzeszekk
Cytat(by_ikar @ 21.11.2011, 09:38:57 ) *
yy to nie jest inspiracja z symfony, akurat symfony i wiele innych FW, jak i klas to wykorzystuje. Jak wpływa na wydajność? Dokładnie ci nie powiem, ale wydaje mi się że to jest bez różnicy. Mam taki swój powiedzmy framework, w którym kilka obiektów korzysta z method chaining (sklejanie zapytań do bazy, paginator i coś by się jeszcze znalazło), a mimo to wyświetlenie podstrony (zalogowany użytkownik, jakieś 10 zapytań do bazy, szablon, jakieś dodatkowe pierdoły) a strona nie generuje się powyżej 400ms zużywając średnio 2-3mb.



Nie wiem jak jest w eclipse, bo z niego nie korzystam, ale u siebie w phpdesigner wystarczy że wstawię dolara i już mam listę zmiennych które mogę użyć.


Jak pisałem klase do generowania kodu HTML na podstawie obiektów PHP (mialem taki kaprys zeby np nie pisać <div arg1="cc" arg2="ff....></div> i nie mylic sie przy tym literówkami, to napisałem klase ktora wstawiala diva za pomocą new Block($parent, $content))
to metoda rekurencyjna generująca ten kod (tj rysuje <div, wszystkie argumenty, > i tutaj wywoluje draw dla wszystkich dzieci </div>) dzialala 20 razy wolniej niz metoda nierekurencyjna uzywajaca zamiast wywolan metod skoków goto w obrębie jednej metody.

W php sa wolne wywołania funkcji i nie szalałbym tutaj z nadmiernym robieniem funkcji wykonujących jedną linijkę kodu, sam pisząc nieraz mam opór by użyć getterów i setterów ale robie to dla dobra swojego i ogółu.

W php wg mnie akurat metod chaining jest kompletnie niepotrzebny bo mamy parametry opcjonalne.

konstrukcja zapytania do bazy rownie dobrze zamiast
$database->select()->from("fff")->where('xxx")...
moze wygladac
$database->select($filterExpression=null, $sortingExpression=null,$limit=null,$offset=null);
i kazdy wpisuje tyle parametrów ile mu potrzeba.

mnie sie wydaje ze method chaining moglo by nie miec wielkiej roznicy w wydajnosci w języku kompilowanym, chociazby do kodu bajtowego. natomiast w php będzie miało i ja kiedys nieopatrznie go uzyjesz w metodzie ktora jest wywoływana w skrypcie 1000 razy to sam sie bedziesz dziwil skąd ci sie wział extremalny czas generowania strony.
by_ikar
Cytat
konstrukcja zapytania do bazy rownie dobrze zamiast
$database->select()->from("fff")->where('xxx")...
moze wygladac
$database->select($filterExpression=null, $sortingExpression=null,$limit=null,$offset=null);
i kazdy wpisuje tyle parametrów ile mu potrzeba.


Subtelna różnica akurat w tym przypadku jest taka, że mogę niektóre "argumenty" mieć w różnych miejscach:

Kod
$pagination->setTotalCount(12)->setCurrentPage(2);


a mogę to też w taki sposób zapisać:

Kod
$pagination->setCurrentPage(2)->setTotalCount(12);


Nie wiem jaki jest narzut, może ktoś ma jakiś mały test przeprowadzony.

Odnośnie generowania html poprzez php czy inne języki mam swoje zdanie, a jest ono takie że jest to zbędny narzut i jest mi to wcale do szczęścia nie potrzebne.
redeemer
Z mojego doświadczenia method chaining nie wpływa na wydajność (mam na myśli serwery produkcyjne z cacheowaniem bytecode).
Orzeszekk
Ja test robilem na komputerze bez cachowania bytecodu, czyli na zwykłym apaczu na swoim komputerze.

a czy ja ci ikar wciskam generowanie kodu? to byl tylko przyklad ze wielokrotne wywołania małych metod spowalniają wydajność (w przypadku braku kompilacji do kodu bajtowego).

Skoro method chaining na produkcyjnych nie spowalnia, to i getterow/setterów można uzywać wszedzie gdzie sie da tak samo jak zwykłej publicznej zmiennej?biggrin.gif
by_ikar
Cytat
a czy ja ci ikar wciskam generowanie kodu? to byl tylko przyklad ze wielokrotne wywołania małych metod spowalniają wydajność (w przypadku braku kompilacji do kodu bajtowego).


Nie mówię że mi wciskasz wink.gif tyle że według mnie to jest zbędne.

Na komputerze sprawdzałeś? Na linuxie czy na windowsie? Na windowsie ogólnie php/apache chodzi wolniej. Akurat testuje na windowsie a potem na linuxie (właściwie unixie, centos) z dość zbliżonymi ustawieniami. Różnica w wydajności to średnio 30-40% na niekorzyść windowsa.
Orzeszekk
Cytat(by_ikar @ 21.11.2011, 19:57:18 ) *
Nie mówię że mi wciskasz wink.gif tyle że według mnie to jest zbędne.

Na komputerze sprawdzałeś? Na linuxie czy na windowsie? Na windowsie ogólnie php/apache chodzi wolniej. Akurat testuje na windowsie a potem na linuxie (właściwie unixie, centos) z dość zbliżonymi ustawieniami. Różnica w wydajności to średnio 30-40% na niekorzyść windowsa.


Jest to troche wygodniejsze niz oklejanie kodu HTML kolejnymi tagami za pomocą dekoratora gdyż mam dostęp do drzewa dokumentu jak DOM w javascripcie. i mogę cos tam w dalszej czesci programu w dokumencie zmodyfikować.

ogolnie tez mnie to juz w****wia to pisanie new Block, przerzuciłbym sie na jakieś templaty nawet szablony php ale kiedys mi sie to wydawalo kozackim rozwiązaniem a teraz juz jest za pozno by to wszystko przepisywac od nowa. tak to jest jak kazdy pisze od nowa wlasny framework:D
ano
To zainteresuj się TWIG'iem. Szybko i fajnie się go używa. http://twig.sensiolabs.org/ Ma wszystko to co potrzebne a przy okazji jest szybki.
Możesz o nim (w porównaniu z innymi systemami) poczytać trochę tutaj: http://fabien.potencier.org/article/34/tem...-engines-in-php
Orzeszekk
Cytat(ano @ 22.11.2011, 23:27:52 ) *
To zainteresuj się TWIG'iem. Szybko i fajnie się go używa. http://twig.sensiolabs.org/ Ma wszystko to co potrzebne a przy okazji jest szybki.
Możesz o nim (w porównaniu z innymi systemami) poczytać trochę tutaj: http://fabien.potencier.org/article/34/tem...-engines-in-php


system uzyty w symfony mi wystarczy, jakos wole szablony PHP niz uczyc sie od nowa programowania w Twigu.
php powstalo jako system szablonów i mi to odpowiada.

Kiedys do embedowania kodu php w htmlu zniechecalo mnie to ze musialem zrobic duza ilosc malych plików aby sie nie powtarzac,
obawialem sie ze duza ilosc plików spowolni program przy konsolidacji.

drukowalem kod html za pomocą echo, a pozniej wypracowalem sobie rozwiazanie na obiektach generujace kod. i w tym projekcie migracja juz jest niemozliwa, tam musi tak zostac.

ale skoro symfony w swoim cache zlepia te wszystkie html-e w całość to niczego wiecej mi nie potrzeba, i nie bedzie zadnego narzutu. (na nowe projekty)

Przejrzalem ten system templatów Twig, moim zdaniem jezeli uzywa sie symfony to nie ma absolutnie potrzeby stosowania go. jezeli kogos wkurza pisanie <?php ?> to moze uzyc asp tags <% %>. Domyslne escapowanie wszystkich zmiennych wychodzących ze skryptu jest co najmniej wkur....ce, a co jezeli bedziesz chcial wydrukowac kod html ze zmiennej? Fajnie ze sa funkcje ale nie powinny ograniczac pola manewru i wymuszac kombinowania naokolo czegos co sie powinno dac zrobic od razu.

A co do porownania predkosci no cóż - nie napisał jaką predkosc ma PHP w uzyciu jako system szablonów - wcale nie wiadomo czy twig jest szybszy od natywnego kodu PHP.
irmidjusz
Cytat(Orzeszekk @ 19.11.2011, 14:31:57 ) *
Zalozmy ze mam jakis obiekt Obiekt i drugi obiekt ObiektSterujacy.

chce by ObiektSterujacy mogl wywolac metode obiektu Obiekt->zmienCostam() i cos w nim zmienic, ale zeby tylko obiektSterujacy mogl wywolac ta metode. Dla klasy KlasaPoboczna metoda zmienCostam powinna byc chroniona.


Co prawda pytanie było zadane 3 miesiące temu, ale dorzucę pewien pomysł. Otóż czasem stosuję taką technikę jak opisujesz (o ile dobrze Cię zrozumiałem) - że obiekty pewnej "uprzywilejowanej" klasy (najczęściej fabryki/buildera) mogą używać metod/zmiennych innej klasy, za to instancje innych klas już nie. Rozwiązanie jest dość proste i wykorzystuje fakt, że metody/właściwości protected z klasy bazowej są dostępne do wywołania w klasach potomnych dziedziczących z tej klasy bazowej.

Działa to tak:

  1. abstract class Bazowa {
  2. protected function specjalnaMetoda($specjalnyParametr) {
  3. //tra la la specjalne operacje bardzo niebezpieczne
  4. }
  5. }
  6.  
  7. class Obiekt extends Bazowa {
  8. //różne metody, jak to w każdej klasie bywa...
  9. }
  10.  
  11. class ObiektSterujacy extends Bazowa {
  12. public function skonfigurujObiekt(Obiekt $obiekt) {
  13. //różne rzeczy do zrobienia, w tym:
  14. $obiekt->specjalnaMetoda($jakisParametr);
  15. }
  16. }


Oczywiście, KlasaPoboczna nie może być pochodną klasy Bazowa, aby nie mogła wywołać metody Obiekt::specjalnaMetoda().

To trochę takie symulowanie pakietów Javy czy też metod zaprzyjaźnionych w C++ wink.gif Taki półśrodek - czasami go stosuję w specjalnych sytuacjach.
A co z fartem tym, że w klasie ObiektSterujacy jest dostępna metoda specjalnaMetoda()? Nic - publicznie i tak nie jest dostępna (protected), a dla jasności można ją w tej klasie przesłonić jako final z pustym ciałem i odpowiednim komentarzem.
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.