To że public
to "wystawianie na świat" to nie do końca prawda. Jeśli masz jakieś zadanie, jakąś odpowiedzialność która ma być realizowana przez klasę to z reguły każda część jej interfejsu ma być public
. Jeśli korzystasz z jakiejś klasy wbudowanej, to metody z których korzystasz są właśnie public.
Jeśli klasa ma metodę która nie należy do jej interfejsu - jest to po prostu jakaś metoda związana z implementacją, i żaden klient klasy nie powinien zależeć od takiej implementacji - wtedy taką metodę robi się private
. Ma to swoje zalety, bo metody private
można do woli refactorować, zmieniać i usuwać, i żadnego kod korzystającego z tej klasy nie trzeba będzie zmienić.
Jeśli natomiast z Twojej klasy coś ma dziedziczyć (albo jest to klasa abstrakcyjna, i coś ją implementuje), i ta dziedzicząca klasa chce korzystać z metody rodzica, która nie jest częścią interfejsu, to wtedy ona jest protected
(bo gdyby była private
to ta dziedzicząca klasa nie wiedziałaby o istnieniu takiej metody).
Innymi słowy:
-
public
- Jak ją zmienisz, to wszystko co korzysta z klasy będzie musiało być zmienione
-
protected
- Jak ją zmienisz, to tylko klasy dziedziczące będę musiały być zmienione
-
private
- Jak ją zmienisz, to nie ma to specjalnych konsekwencji.