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

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

Геттеры и сеттеры - это скрытые функции. А вызов функции медленнее, чем просто установка поля, потому что вам нужно копировать аргументы, вставлять и выталкивать фрейм стека, копировать результат и т. Д.

Что ж, компиляторы могут оптимизировать вызов функции и встроить присваивание, но это то, что вы не можете контролировать. Даже встроенное ключевое слово в C ++ - это всего лишь подсказка, и компиляторы могут его игнорировать. Вы должны предполагать, что функция вызывается, и она будет работать медленнее.

Более того, никогда языки (например, C #) не поддерживают свойства и имитируют это, но это не что иное, как функции, которые выглядят как поле, вы даже не можете сказать, что это функция или поле (без помощи IDE).

Какие проблемы возникли бы, если бы мы могли установить разные модификаторы доступа для записи и чтения (как, например, в файловых системах), кроме простого указания, что это нарушит догматический принцип инкапсуляции?


person Calmarius    schedule 14.05.2011    source источник
comment
(Должно быть вики сообщества, но я не могу найти, где это установить.)   -  person Calmarius    schedule 14.05.2011
comment
Что-то связано с вмешательством в полиморфизм, но я не могу сформулировать это в виде достаточно связного ответа для публикации.   -  person Ignacio Vazquez-Abrams    schedule 14.05.2011
comment
Они действительно поддерживают это. Они просто реализуют это в виде специального метода, называемого свойством.   -  person Cody Gray    schedule 14.05.2011


Ответы (1)


Но вы можете создавать свойства с разным доступом для геттеров и сеттеров в C #:

public int Foo {
    get { return foo; }
    protected set { foo = value; }
}

protected int Bar { get; private set; }

Первый создает свойство «Foo» с общедоступным получателем и защищенным установщиком, а второй создает свойство «Bar» с защищенным получателем и частным установщиком.

Что касается Objective-C, язык специально для общего случая («общедоступный» геттер, «частный» сеттер), позволяющий вам объявить свойство readonly, а затем повторно объявить его readwrite в расширении или подклассе класса.

Какие еще языки вы имеете в виду?

person Anomie    schedule 14.05.2011
comment
Я надеюсь, что компилятор сможет встроить эти свойства. - person Calmarius; 24.05.2011