-3

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

4

4 回答 4

2

这种事情有无数的答案,“为什么语言 X 没有特征 Y?” 答案很简单,因为参与创建/发展语言的人没有把它放在那里。计算机语言就像<insert anything here that has variations across members in the set>,不是所有的都是一样的。(我们大多数人都对此表示感谢。;)

哦,移动目标问题...

我不是 Objective-C 方面的专家,但是快速谷歌搜索“动态语言中的私有成员函数”发现了一些似乎暗示 Objective-C 确实对类有私有成员支持的命中。

于 2012-11-16T21:13:07.807 回答
2

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

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

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

就实现而言,访问检查的成本相对较高(至少对于某些属性访问,会有额外的操作,规则越微妙,检查就越复杂),所以全私有和全公有的模型比较多比任何具有中等访问级别的东西都更具吸引力。

于 2012-11-16T21:17:23.313 回答
0

您可以在 Objective-C 中使用类扩展来使其他类看不到某些内容。前任。

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

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

于 2012-11-16T21:13:11.157 回答
0

或者,除了@Mettable 的答案:

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

.
.
.

@end

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

于 2012-11-16T21:17:52.800 回答