class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
Этот код компилируется в C#, и эквивалент работает на PHP, но может ли кто-нибудь объяснить причину, по которой здесь можно изменить otherTestClass._privateString
?Почему переменная частного члена может быть заменена экземпляром класса?
Я бы предположил, что экземпляр класса не должен изменять переменную частного члена ни при каких обстоятельствах, и что попытка доступа к otherTestClass._privateString
даст ошибку «недосягаемой из-за уровня защиты».
Это не так, поэтому почему создание экземпляра объекта внутри его собственного класса позволяет вам получить доступ к закрытым членам? И должно ли это, разве это не разрывает инкапсуляцию до такой степени? Или я пропущу что-то очевидное?
- (я не прошу, если выше класс дизайн является хорошей практикой, просто интересно о теории позади него.)
Редактировать - Спасибо за ответы и комментарии. Чтобы уточнить, мне также интересно узнать, может ли быть способным сделать это, как положительную функцию, или если это необходимый компромисс для лучшей проверки времени компиляции/ясности кода/потому что большинство других языков делают это так или иначе. Мне кажется, что в идеале компилятор предупредил бы вас об этом, но тогда я далек от разработчика языка. Любые примеры того, как именно это позволяет вам сделать что-то полезное (без нарушения инкапсуляции), которое в противном случае было бы трудным или невозможным, было бы здорово.
BTW: Вы можете сделать 'ChangeData()' even 'static', и вы все равно сможете получить доступ к закрытым членам. – ulrichb
@ulrichb - Важно отметить для OP, что вы не можете использовать ключевое слово 'this' для доступа к закрытым членам, если' ChangeData() 'является' static'. – TheCloudlessSky
В качестве примера языка, который отличается от - в Ruby, общедоступность - это одно и то же, но частные средства «доступны только для одного и того же экземпляра» и защищенные средства «доступны только из одного класса». Наследование здесь не имеет никакого отношения. – Tesserex