class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
Этот код компилируется в C #, а эквивалент работает в PHP, но может кто-нибудь объяснить причину, по которой otherTestClass._privateString
можно изменить здесь?
Я бы подумал, что экземпляр класса не сможет изменить личную переменную-член ни при каких обстоятельствах, и что попытка доступа к otherTestClass._privateString
приведет к ошибке «недоступен из-за уровня защиты».
Однако это не тот случай, так почему создание экземпляра объекта внутри его собственного класса позволяет вам получить доступ к закрытым членам?И разве это не нарушает степень инкапсуляции?Или я упускаю что-то очевидное?
- (я не спрашиваю, является ли приведенный выше дизайн класса хорошей практикой, просто интересуюсь теорией, стоящей за этим.)
Редактировать - Спасибо за ответы и комментарии.Чтобы уточнить, мне также интересно узнать, рассматривается ли возможность сделать это как положительную особенность, или это необходимый компромисс для лучшей проверки во время компиляции / ясности кода /, потому что большинство других языков делают это таким образом или как-то еще.Мне кажется, что в идеале компилятор мог бы предотвратить или предупредить вас об этом, но тогда я далек от языкового дизайнера.Любые примеры того, как это позволяет вам делать что-то полезное (без нарушения инкапсуляции), что в противном случае было бы трудно или невозможно, было бы замечательно.