Sporo odpowiedzi zostało już dodanych do tego interesującego wątku, jednak nie do końca znalazłem prawdziwy powód, dla którego takie zachowanie jest takie, jakie jest. Spróbuję:
W dawnych czasach
Gdzieś pomiędzy Smalltalk w latach 80-tych a Javą w połowie lat 90-tych dojrzewała koncepcja orientacji obiektowej. Ukrywanie informacji, które pierwotnie nie było uważane za koncepcję dostępną tylko dla OO (wspomniane po raz pierwszy w 1978 r.), Zostało wprowadzone w Smalltalk, ponieważ wszystkie dane (pola) klasy są prywatne, wszystkie metody są publiczne. Podczas wielu nowych opracowań OO w latach 90-tych Bertrand Meyer próbował sformalizować wiele koncepcji OO w swojej przełomowej książce Object Oriented Software Construction (OOSC), która od tego czasu jest uważana za (prawie) ostateczne odniesienie do koncepcji OO i projektowania języka .
W przypadku prywatnej widoczności
Według Meyera metoda powinna być dostępna dla określonego zbioru klas (str. 192-193). Daje to oczywiście bardzo dużą szczegółowość ukrywania informacji, następująca funkcja jest dostępna dla klasy A i klasy B oraz wszystkich ich potomków:
feature {classA, classB}
methodName
W przypadku private
on mówi co następuje: bez jawnego zadeklarowania typu jako widocznego dla własnej klasy, nie możesz uzyskać dostępu do tej cechy (metody / pola) w wywołaniu kwalifikowanym. To x
znaczy, jeśli jest zmienną, x.doSomething()
nie jest dozwolone. Niekwalifikowany dostęp jest oczywiście dozwolony wewnątrz samej klasy.
Innymi słowy: aby zezwolić na dostęp instancji tej samej klasy, musisz jawnie zezwolić tej klasie na dostęp do metody. Jest to czasami nazywane prywatnymi instancjami i klasami prywatnymi.
Instancja prywatna w językach programowania
Znam co najmniej dwa obecnie używane języki, w których ukrywa się prywatne informacje instancji w przeciwieństwie do ukrywania prywatnych informacji klasowych. Jednym z nich jest Eiffel, język zaprojektowany przez Meyera, który przenosi OO do skrajności. Drugim jest Ruby, obecnie o wiele bardziej powszechny język. W Rubim private
oznacza: „prywatny dla tej instancji” .
Wybory dotyczące projektowania języka
Sugerowano, że zezwolenie na prywatność instancji byłoby trudne dla kompilatora. Nie sądzę, ponieważ stosunkowo łatwo jest po prostu zezwolić lub zabronić kwalifikowanych wywołań metod. Jeśli w przypadku metody prywatnej doSomething()
jest to dozwolone, a x.doSomething()
nie, projektant języka skutecznie zdefiniował dostępność tylko dla instancji dla prywatnych metod i pól.
Z technicznego punktu widzenia nie ma powodu, aby wybierać jedną lub drugą stronę (zwłaszcza biorąc pod uwagę, że Eiffel.NET może to zrobić z IL, nawet w przypadku dziedziczenia wielokrotnego, nie ma żadnego powodu, aby nie zapewniać tej funkcji).
Oczywiście jest to kwestia gustu i jak już inni wspomnieli, całkiem niektóre metody mogą być trudniejsze do napisania bez funkcji widoczności na poziomie klasy prywatnych metod i pól.
Dlaczego C # umożliwia tylko hermetyzację klas, a nie hermetyzację wystąpień
Jeśli spojrzysz na wątki internetowe dotyczące hermetyzacji instancji (termin używany czasami w odniesieniu do faktu, że język definiuje modyfikatory dostępu na poziomie instancji, a nie na poziomie klasy), koncepcja ta jest często źle widziana. Jednak biorąc pod uwagę, że niektóre współczesne języki używają enkapsulacji instancji, przynajmniej dla modyfikatora dostępu prywatnego, sprawia, że myślisz, że może być i jest użyteczne we współczesnym świecie programowania.
Jednak C # najwyraźniej najtrudniej przyjrzał się C ++ i Javie ze względu na projekt języka. Podczas gdy Eiffel i Modula-3 również były na obrazku, biorąc pod uwagę wiele brakujących funkcji Eiffla (dziedziczenie wielokrotne), uważam, że wybrali tę samą trasę, co Java i C ++, jeśli chodzi o modyfikator dostępu prywatnego.
Jeśli naprawdę chcesz wiedzieć, dlaczego powinieneś spróbować skontaktować się z Ericiem Lippertem, Krzysztofem Cwaliną, Andersem Hejlsbergiem lub kimkolwiek innym, kto pracował nad standardem C #. Niestety, nie mogłem znaleźć ostatecznej notatki w opatrzonym adnotacjami języku programowania C # .