До цієї цікавої нитки вже додано кілька відповідей, однак я не зовсім знайшов справжню причину, чому така поведінка є такою, якою вона є. Дозвольте спробувати:
Ще в дні
Десь між Smalltalk в 80-х і Java в середині 90-х років визріла концепція орієнтації на об'єкти. Інформація про приховування, спочатку не розглядалася як концепція, доступна лише для OO (згадана спочатку в 1978 р.), Була введена в Smalltalk, оскільки всі дані (поля) класу є приватними, усі методи є загальнодоступними. Під час багатьох нових розробок ОО в 90-х Бертран Мейєр намагався формалізувати значну частину концепцій ОО у своїй знаковій книзі " Об'єктно-орієнтована побудова програмного забезпечення" (OOSC), яка з тих пір вважається (майже) остаточним посиланням на концепції OO та мовний дизайн .
У випадку приватної видимості
За Мейєром, метод повинен бути доступний для визначеного набору класів (стор. 192-193). Це, очевидно, дає дуже високу деталізацію прихованості інформації, наступна особливість доступна класамA та classB та всім їх нащадкам:
feature {classA, classB}
methodName
У разі private
він говорить наступне: без явного оголошення типу видимим для власного класу, ви не можете отримати доступ до цієї функції (методу / поля) в кваліфікованому виклику. Тобто, якщо x
це змінна, x.doSomething()
не дозволена. Безумовно, доступ дозволений, звичайно, всередині самого класу.
Іншими словами: щоб дозволити доступ екземпляру того ж класу, ви повинні дозволити методу доступ до цього класу явно. Іноді це називається екземпляр-приватний проти клас-приватний.
Примірник-приватний у мовах програмування
Я знаю щонайменше дві мови, які в даний час використовуються, які використовують приховування приватної інформації, на відміну від приховування приватно-класової інформації. Один - Ейфелева, мова, розроблена Мейєром, яка підводить ОО до найбільшої межі. Інший - Рубі, набагато більш поширена мова в наш час. У Ruby private
означає: "приватний для цього екземпляра" .
Вибір мовного дизайну
Було висловлено припущення, що дозвіл екземпляра-приватного буде важким для компілятора. Я не думаю, що так просто, як просто дозволити або заборонити кваліфіковані дзвінки до методів. Якщо для приватного методу doSomething()
дозволено, а x.doSomething()
це не так, мовний конструктор ефективно визначив доступність для приватних методів та полів, доступних лише для примірників.
З технічної точки зору, немає жодної причини вибирати той чи інший спосіб (наприклад, якщо врахувати, що Eiffel.NET може це зробити з IL, навіть при багатократному успадкуванні, немає властивої причини не надавати цю функцію).
Звичайно, це питання смаку, і як уже згадувалося, цілком важче написати деякі методи без особливості видимості приватних методів та полів на рівні класу.
Чому C # дозволяє лише інкапсуляцію класу, а не інкапсуляцію примірника
Якщо ви дивитесь на Інтернет-потоки щодо інкапсуляції екземплярів (термін, який іноді використовується для позначення того, що мова визначає модифікатори доступу на рівні екземпляра, на відміну від рівня класу), ця концепція часто насувається. Однак, враховуючи, що деякі сучасні мови використовують інкапсуляцію екземплярів, принаймні для модифікатора приватного доступу, змушують вас думати, що це може бути і є корисним у сучасному світі програмування.
Однак C #, правда кажучи, найважче виглядав на C ++ та Java за його мовний дизайн. У той час як Ейфель і Модула-3 також були на знімку, враховуючи безліч особливостей відсутності Ейфеля (багаторазове успадкування), я вважаю, що вони вибрали той самий маршрут, що і Java та C ++, коли мова зайшла про модифікатор приватного доступу.
Якщо ви дійсно хочете дізнатись, чому вам слід спробувати домогтися Еріка Ліпперта, Кшиштофа Кваліна, Андерса Хейльсберга чи будь-кого іншого, хто працював за стандартом C #. На жаль, я не зміг знайти остаточну замітку в анотованій мові програмування C # .