我应该这样说,我来自Java / Android背景,这使我对“成员”一词的理解更加明确。也就是说,我开始学习Objective-C并且遇到了isMemberOfClass方法,这个名字让我感到困惑。
我理解isMemberOfClass返回一个布尔值,指示接收者是否是给定类的实例。但是,我不明白为什么在检查它是否为INSTANCE时它被称为isMEMBER。
有什么关于语言协议的东西,我不知道将它命名为有意义吗?成员在Objective-C中的含义是否与在Java中有所不同?
我理解成员的定义的方式,它是类HAS(方法或数据),而不是类IS(类型)。
任何人都可以清除这个看似奇怪的命名惯例吗?谢谢你帮助一个新手!
答案 0 :(得分:6)
这里的关键注意事项是Cocoa(以及之前的SmallTalk)不使用“成员”一词来表示“实例变量”或“函数”或使用“成员”一词的任何其他方式在Java或C ++中。 Harry H. Porter III中有一个有用的paper on SmallTalk给出了一些背景信息:
如前所述,每个对象包含零个或多个字段。术语“字段”是优选的,但是其他语言对于相同的概念使用术语“数据成员”。 Smalltalk使用术语“实例变量”来表示一个字段,因此我们说,“一个对象包含多个实例变量”,意思是“一个对象包含多个字段”或“一个对象包含多个数据成员”。我们将交替使用术语“字段”和“实例变量”。
...
在Java或C ++中,程序员可以向任何类添加“静态数据成员”和“静态成员函数”。 Smalltalk具有类似的能力,虽然静态数据成员称为“类变量”,静态成员函数称为“类方法”。 (回想一下,Smalltalk调用普通字段“实例变量”,并调用普通成员函数“实例方法”。)
在Cocoa中,术语“成员”通常用于集合的上下文中(参见[NSSet member:]
)。 isMemberOfClass:
提出的问题是“此对象是此特定类的所有实例集合的成员。”
这并不是说isInstanceOfClass:
可能是一个不像Cocoa的名字。这只是“成员”在这里与其他语言没有相同的含义。
答案 1 :(得分:2)
iOS框架中不存在作为类组件(方法或数据)的成员的概念。该框架还围绕冗长且通常较长的方法或变量名称构建,以促进“增加的可读性”(在引号中,因为它并不总是必然的结果)。
很容易将其命名为isInstanceOfClass
,但这可能会导致与子类混淆。 isMemberOfClass
恰好是一个简单的方法名称,它不会与iOS框架的任何原则相冲突,并且非常自我解释。我不认为逻辑超出了这个范围。
答案 2 :(得分:2)
我认为术语“成员”用于表示实例变量或方法(抱歉,成员函数)可以追溯到C ++。我个人从未听说它与Java一起使用,但我的听力可能不是最好的。
Objective-C几乎是C ++所不具备的一切 - 反之亦然。 Objective-C历史上基于smalltalk,并且继承了大部分环境的做事方式。引用Smalltalk的“发明者”之一Alan Kay的话说:“我发明了面向对象的编程,而C ++并不是我想到的”,只是为了说明两个阵营之间的感情。
所以回答你的问题:是的,“成员”在Objective-C和C ++中有不同的含义,如果你在深入了解Objective-C时发现其他含义不同的词,也不要太惊讶。 / p>