Dzisiaj zauważyłem, że zasadniczo nigdy nie używam protected
metod w kodzie C ++, ponieważ rzadko czuję potrzebę wywoływania niepublicznych metod rodzica. Używam trybu chronionego w Javie we wzorcu metod szablonów, ale ponieważ możesz zastąpić metody prywatne w C ++, ja też nie potrzebuję protected
.
Więc jakie są niektóre scenariusze w świecie rzeczywistym, w których chciałbym zastosować protected
metody w kodzie C ++?
(Zauważ, że ogólnie nie przepadam za dziedziczeniem implementacji, co może wiele wyjaśniać ...)
źródło
Jednym z często używanych przykładów jest to, że w klasie podstawowej mojego obiektu Hierarchia będę miał chroniony program rejestrujący. Wszystkie moje podstawowe klasy będą potrzebowały dostępu do Logger, ale nie ma powodu, aby udostępnić to publicznie.
Ponadto, jeśli używasz wzorca szablonu i masz metodę wykonywania przed wykonaniem lub po jej wykonaniu w klasie bazowej, możesz wywołać implementację podstawową z metody zastępującej. Jeśli baza jest tylko prywatna (i nadal można ją zastąpić w C ++), nie będzie można wywołać implementacji podstawowej z metody przesłaniającej.
źródło
Tylko przykład, z którego korzystałem w przeszłości. Metody chronione świetnie nadają się do zapewniania funkcji specyficznych dla implementacji, a jednocześnie pozwalają klasie podstawowej na właściwe śledzenie rzeczy. Rozważ klasę podstawową, która zapewnia nadrzędną funkcję inicjowania, ale musi również mieć stan, aby określić, czy zainicjowano:
Tutaj wszystko jest dobrze. Z wyjątkiem sytuacji, gdy klasa pochodna nie zadaje sobie trudu, aby wywołać
setInitialized()
nie tylko fakt, że każdy może ją nazwać (moglibyśmy to tutaj zabezpieczyć, i kolejny powód, aby używać chronionych metod!). Wolę klasę, która korzysta z wirtualnych członków chronionych:W naszej nowej klasie cała inicjalizacja jest nadal delegowana do klasy pochodnej. Pod warunkiem, że został zgłoszony wyjątek, utrzymujemy umowę „ta klasa została zainicjowana”, która według naszej metody się wydarzy.
źródło
Podobnie jak wiele innych funkcji,
protected
pozwala w pewnym stopniu przerwać enkapsulację. Łamanie czystych koncepcji OO zwykle odbywa się z kilku powodówinline
),friend
pozwala ograniczyć dostęp do członków klasy do kilku znajomych)i
protected
jest tylko jednym z narzędzi w tym pudełku. Możesz go użyć, jeśli chcesz dać klasom pochodnym dostęp do niektórych części klasy, które powinny być ukryte przed ogółem społeczeństwa.Jednym z przypadków, w których go użyłem, jest stworzenie wszystkich konstruktorów klasy
protected
, w zasadzie uczynienie tej klasy abstrakcyjną (nie można jej utworzyć, chyba że jest to podobiekt obiektu klasy pochodnej).źródło
Być może był to zły projekt, ale miałem go do czegoś takiego:
Klasy pochodne
update()
mogą wywoływać sygnał przez wywołanietrigger_signal()
. Ale ponieważ to wszystko, co powinni zrobić z sygnałem, sam sygnał pozostawiono prywatny. Funkcja wyzwalania została zabezpieczona, ponieważ tylko klasa pochodna powinna być w stanie ją uruchomić, a nie cokolwiek.źródło
„Metody publiczne”: klasa może to zrobić. „Metody chronione”: Jak klasa może to zrobić. „Metody prywatne”: Jak klasa może to zrobić, ale „Jestem paranoikiem i nie chcę, aby ktokolwiek wiedział, jak to robię”.
Tak więc nowy kucharz (programista) przybywa do restauracji typu fast food. Uczysz go, sprzedajesz burgerów (metody publiczne), jak przygotować burgerów (metody chronione), ale zachowaj dla siebie „opatentowany” tajny sos z przepisu.
źródło