Почему динамические языки не имеют функции определения закрытых членов в классах (например, цель 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
Кроме этого, сказать особо нечего, так как это слишком широкий вопрос (до сих пор).