Мой вопрос относится к Java, но он также может применяться к C#. Мне было интересно, почему все рекомендуют делать переменные экземпляра частным в отличие от их создания защищено.Почему рекомендуется указывать переменные экземпляра как частные?
Давайте просто подумаем об этом. Частные переменные не рассматриваются подклассом, поэтому, если мне нужно получить доступ или изменить переменные суперкласса в моем подклассе, я вынужден использовать некоторый метод доступа и мутаторов, например getMyPrivateVariable
или setMyPrivateVariable
. Но когда вы расширяете некоторый класс и наследуете его члены, это работает так, как будто вы объявили их непосредственно в подклассе. Поэтому логически это означает, что подкласс должен также иметь прямой доступ к переменным экземпляра и делает случай для проектирования класса с защищенными переменными. Я понимаю, что такая практика нарушит инкапсуляцию, но это кажется неуместным в случае наследования, потому что, опять же, в этом случае все работает так, как если бы члены суперкласса были объявлены в подклассе, поэтому подкаска имеет «естественное право», за возможность напрямую обращаться к своим членам, независимо от того, были ли они унаследованы или нет. Инкапсуляция, на мой взгляд, важнее для взаимодействия с объектом другими объектами, которые находятся за пределами дерева наследования объекта.
Итак, мой вопрос в том, почему каждый рекомендует объявлять переменные экземпляра класса как частные, а не защищенные?
Это вопрос подходящий для программистов.stackexchange.com, а не для StackOverflow. – m3th0dman
Не все _ делает. Но из вашего текста кажется, что вы поняли «защищенный»; в любом случае, делайте то, что считаете правильным. – fge
Просто потому, что класс позволяет наследование не означает, что он хочет разрешить произвольное повреждение своих внутренних инвариантов дочерними классами. Создание полей (и некоторых методов) 'private' позволяет это. – dlev