Почему языки ООП не имеют модификатора доступа 'только для чтения'?

Каждый раз я пишу, тривиальные методы считывания (получите функции, которые просто возвращают значение участника), интересно, почему языки ООП просто не имеют модификатора доступа 'только для чтения', который позволил бы читать значение членов объекта, но не позволяет Вам устанавливать их точно так же, как вещи константы в C++.

Частное, защищенный, модификаторы открытого доступа дают Вам или полный (чтение-запись) доступ или никакой доступ.

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

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

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

Править: Я не сделал составил мое четкое сообщение. Прошу прощения. Я подразумеваю, что можно считать значение участника снаружи, но Вы не можете установить его. Можно только установить его значение в объеме класса.

7
задан Calmarius 18 July 2010 в 13:11
поделиться

9 ответов

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

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

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

11
ответ дан 6 December 2019 в 06:13
поделиться
9
ответ дан 6 December 2019 в 06:13
поделиться

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

0
ответ дан 6 December 2019 в 06:13
поделиться

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

public int Foo { get; private set; }

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

5
ответ дан 6 December 2019 в 06:13
поделиться

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

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

private int _foo;

public int Foo
{
    get { return _foo; }
}
2
ответ дан 6 December 2019 в 06:13
поделиться

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

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

2
ответ дан 6 December 2019 в 06:13
поделиться

В Delphi:

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

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

0
ответ дан 6 December 2019 в 06:13
поделиться

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

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

Anders Hejlsberg: Да. Что касается const, это интересно, потому что мы постоянно слышим эту жалобу: "Почему у вас нет const?". Неявный в этом вопросе: "Почему у вас нет const, которая принудительно выполняется временем выполнения?" Это действительно то, о чем люди спрашивают, хотя они не и не говорят об этом.

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

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

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

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

0
ответ дан 6 December 2019 в 06:13
поделиться

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

0
ответ дан 6 December 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: