为什么动态语言在类中没有私有成员定义功能(如 objective c 或 python)?



为什么动态语言缺乏在类中定义私有成员的能力?此功能是否存在任何实现问题?这个特性有可能在动态语言中实现吗?

这可以为动态语言实现。事实上,在Smalltalk中,所有成员都是私人的。

这种情况之所以不常见,是因为同时拥有公共和私人成员毫无意义。作为设计问题,外部代码不应该访问其他类的内部。这可以通过不这样做来实现——不小心做到这一点并不容易。

Python通过让所有东西都公开来解决这个问题,并允许程序员在必要时这样做,这创造了最大的灵活性。Smalltalk通过让所有东西都是私有的来解决这个问题,如果需要从其他代码访问,则强制程序员创建访问器。

至于实现问题,访问检查相对昂贵(因为至少对于某些属性访问,会有额外的操作,规则越微妙,检查就越复杂),因此全私有和全公共模型比任何具有中间访问级别的模型都更有吸引力。

这类问题有无数的答案,"为什么语言X没有功能Y?"答案只是因为参与创建/发展语言的人没有把它放在那里。计算机语言就像<insert anything here that has variations across members in the set>,并不是所有语言都一样。(我们大多数人都对此表示感谢。)

哦,移动目标问题。。。

我不是Objective-C的专家,但在谷歌上快速搜索"动态语言中的私有成员函数"会发现一些热门内容,这似乎意味着Objective-C确实对类提供了私有成员支持。

您可以在Objective-C中使用类扩展,使其他类看不到某些内容。示例

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

除此之外,没有什么好说的,因为这个问题(仍然)太宽泛了。

或者,除了@Mettable的答案:

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

我不知道Python,但我认为这个SO答案可能会有所帮助。

最新更新