Почему языки не поддерживают отдельные модификаторы доступа для чтения и записи? - PullRequest
4 голосов
/ 14 мая 2011

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

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

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

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

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

1 Ответ

5 голосов
/ 14 мая 2011

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

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

protected int Bar { get; private set; }

Первый создает свойство "Foo" с открытым и защищенным сеттером.в то время как второй создает свойство "Bar" с защищенным геттером и приватным сеттером.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...