Почему динамические языки не имеют функции определения закрытых членов в классах (например, цель c или python)?

Почему у динамических языков нет возможности определять частные члены в классах? Есть ли какие-либо проблемы с реализацией этой функции? Возможно ли реализовать эту функцию для динамического языка?

4 ответа

Решение

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

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

Python решает эту проблему, делая все открытым и позволяя программистам делать это в случае необходимости, что создает максимальную гибкость. Smalltalk решает эту проблему, обеспечивая конфиденциальность всего, и заставляя программистов создавать средства доступа, если требуется доступ из другого кода.

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

Есть бесчисленное множество ответов на такие вопросы: "Почему язык X не имеет функции Y?" И ответ прост, потому что люди, вовлеченные в создание / развитие языка, не поместили его там. Компьютерные языки похожи <insert anything here that has variations across members in the set>, не все одинаковы. (За что большинство из нас благодарны.;)

Ой, движущийся целевой вопрос...

Я не эксперт в Objective-C, но быстрый поиск в Google для "функции закрытого члена в динамических языках" обнаружил некоторые хиты, которые, кажется, подразумевают, что Objective-C имеет поддержку закрытого члена для классов.

Или, кроме того, ответ @Mettable:

@interface MyObject : NSObject {
    @private
    id _myIvar;
    id _myOtherIvar;
}

.
.
.

@end

Я не знаю насчет Python, но думаю, что такой ответ может помочь.

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

//at the top of MyClass.m
@interface MyClass ()
@property (strong, nonatomic) id myPrivateProperty;
@end

Кроме этого, сказать особо нечего, так как это слишком широкий вопрос (до сих пор).

Другие вопросы по тегам