Почему у oop-языков нет модификатора доступа только для чтения? - PullRequest
7 голосов
/ 17 июля 2010

Каждый раз, когда я пишу тривиальные геттеры (функции get, которые просто возвращают значение члена), я удивляюсь, почему у oop-языков просто нет модификатора доступа «только для чтения», который позволял бы читать значение членов объекта но не позволяет вам устанавливать их так же, как const вещи в C ++.

Частные, защищенные, общедоступные модификаторы предоставляют вам полный доступ (чтение / запись) или отсутствие доступа.

Запись геттера и его вызов каждый раз медленна, потому что вызов функции медленнее, чем просто доступ к члену. Хороший оптимизатор может оптимизировать эти вызовы геттера, но это «волшебство». И я не думаю, что будет хорошей идеей узнать, как работает оптимизатор определенного компилятора, и написать код для его использования.

Так зачем нам на практике писать аксессоры, интерфейсы только для чтения, когда только новый модификатор доступа может сработать?

ps1: пожалуйста, не говорите такие вещи, как «Это нарушит инкапсуляцию». Публичный foo.getX() и публичный, но только для чтения foo.x будут делать то же самое.

РЕДАКТИРОВАТЬ: Я не написал свой пост ясно. Сожалею. Я имею в виду, что вы можете прочитать значение члена за пределами, но вы не можете установить его. Вы можете установить его значение только в области видимости класса.

Ответы [ 9 ]

11 голосов
/ 17 июля 2010

Вы неправильно обобщаете один или несколько известных вам языков ООП на языки ООП в целом. Некоторые примеры языков, которые реализуют атрибуты только для чтения:

  • C # (спасибо, Дарин и Тонио)
  • Delphi (= Object Pascal)
  • рубин
  • Scala
  • Objective-C (спасибо, Рано)
  • ... больше?

Лично меня раздражает, что у Java этого нет (пока?). Увидев эту функцию на других языках, вы получаете утомительное написание текста на Java.

9 голосов
/ 17 июля 2010

Ну некоторые языки ООП имеют такой модификатор.

5 голосов
/ 17 июля 2010

В C # вы можете определить автоматическое свойство с различными квалификаторами доступа на наборе и получить:

public int Foo { get; private set; }

Таким образом, реализация класса может повозиться со свойством в его содержании, в то время как код клиентамогу только читать.

2 голосов
/ 17 июля 2010

На самом деле, нет, они не одинаковы.Public foo.getX() по-прежнему позволяет внутреннему коду класса записывать в переменную.Только для чтения foo.x будет доступно только для чтения для внутреннего кода класса.

И есть некоторые языки, у которых есть такой модификатор.

2 голосов
/ 17 июля 2010

C # имеет readonly, Java и некоторые другие имеют final.Вы можете использовать их, чтобы сделать ваши переменные-члены доступными только для чтения.

В C # вы можете просто указать геттер для вашего свойства, чтобы его можно было только читать, но не изменять.

private int _foo;

public int Foo
{
    get { return _foo; }
}
0 голосов
/ 17 июля 2010

Вопрос в значительной степени сводится к следующему: почему не каждый язык имеет свойство const, такое как C ++?

Вот почему его нет в C #:

Андерс Хейлсберг: Да.Что касается const, это интересно, потому что мы постоянно слышим эту жалобу: «Почему у вас нет const?»В этом вопросе подразумевается: «Почему у вас нет const, который поддерживается средой выполнения?»Это действительно то, о чем люди спрашивают, хотя они не выходят и не говорят это так.

Причина, по которой const работает в C ++, заключается в том, что вы можете от него отказаться.Если бы вы не могли выбросить это, тогда ваш мир был бы отстойным.Если вы объявите метод, который принимает const Bla, вы можете передать его неконстантному Bla.Но если все наоборот, ты не сможешь.Если вы объявляете метод, который принимает неконстантный Bla, вы не можете передать ему константный Bla.Так что теперь вы застряли.Таким образом, вам постепенно понадобится постоянная версия всего, что не является постоянным, и вы получите теневой мир.В C ++ вам это сходит с рук, потому что, как и в случае с C ++, это совершенно необязательно, хотите вы эту проверку или нет.Вы можете просто убрать константу, если она вам не нравится.

См .: http://www.artima.com/intv/choicesP.html

Итак, причина, по которой wy const работает в C ++, заключается в том, что вы можете работать вокругЭто.Это целесообразно для C ++, который имеет корни в C.

Для управляемых языков, таких как Java и C #, пользователи ожидают, что const будет таким же безопасным, как, скажем, сборщик мусора.Это также означает, что вы не можете обойти это, и это не будет полезно, если вы не можете обойти это.

0 голосов
/ 17 июля 2010

В Delphi:

strict private
  FAnswer: integer;
public
  property Answer: integer read FAnswer;

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

0 голосов
/ 17 июля 2010

Не говоря уже о свойствах Objective-C 2.0, доступных только для чтения http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html

0 голосов
/ 17 июля 2010

C # свойства позволяют легко определять свойства только для чтения.Смотрите эту статью .

...