c # используя сеттеры или геттеры из базового класса - PullRequest
4 голосов
/ 12 декабря 2008

Рекомендуется ли устанавливать переменные-члены базового класса для защищенных, чтобы подклассы могли обращаться к этим переменным? Или более рекомендуется установить переменные-члены в private и позволить подклассам получать или устанавливать переменные с помощью методов получения и установки?

А если рекомендуется использовать метод получения и установки, когда используются защищенные переменные?

Ответы [ 4 ]

14 голосов
/ 12 декабря 2008

Это очень похоже на этот вопрос о доступе к информации в том же классе через свойства или прямой доступ. Вероятно, стоит прочитать и все эти ответы.

Лично я не хочу, чтобы какие-либо поля были непубличными, за исключением редких статических полей только для чтения с неизменяемыми значениями (постоянными или нет). Для меня свойства просто дают лучшую степень инкапсуляции. Хранение данных - это решение реализация , а не решение API (в отличие от свойств). Почему класс Foo, производный от класса Bar, должен заботиться о реализации класса Bar?

Короче говоря, я всегда обращался к свойствам, и я не использую защищенные переменные для чего-либо, кроме одноразового тестового кода.

Благодаря автоматически реализованным свойствам в C # 3.0 превратить поля в свойства стало проще, чем когда-либо прежде. Для этого есть небольшая причина , а не .

2 голосов
/ 12 декабря 2008

Классы в других сборках могут происходить из ваших открытых классов и иметь доступ к защищенным полям. Если вы когда-нибудь решите превратить эти поля в свойства, эти классы в других сборках необходимо будет перекомпилировать для работы с новой версией вашей сборки. Это называется «нарушение бинарной совместимости» и, возможно, является единственной веской причиной, по которой вам никогда не следует открывать поля вне сборки.

0 голосов
/ 12 декабря 2008

Я должен согласиться с Джоном.

Но я иногда использую защищенную переменную для «самого высокого» класса наследования в некоторых условиях. Например, если у вас есть объект, который доступен только для чтения, и вы не можете установить его обратно, НО вы можете использовать его в дочернем классе, я не понимаю, почему у меня должен быть защищенный метод Get для доступа к этой переменной. Простая защищенная переменная выполняет ту же инкапсуляцию, потому что вы не можете установить эту переменную, и вы можете получить доступ к этой переменной только из дочернего класса.

Но set / get - это способ для другой ситуации.

0 голосов
/ 12 декабря 2008

Это компромисс здесь. Сеттеры и геттеры несколько медленнее, чем прямой доступ к полям, поэтому, если вы занимаетесь тяжелой математикой и часто читаете / пишете эти поля в своих подклассах, вам следует обратиться к этим полям напрямую. Но это больше похоже на исключение.

Обычно вы должны пометить их как закрытые и перейти к получателям / установщикам.

Итак, мой ответ: прямой доступ к интенсивно используемым полям, получателям / установщикам в противном случае. Используйте здравый смысл.

РЕДАКТИРОВАТЬ: Я выполнил некоторое профилирование и, по-видимому, даже в режиме Release может быть разница в скорости между полями и свойствами на 20%. Смотрите мой тестовый пример здесь: http://pastebin.com/m5a4d1597

...