4

我应该先说我来自 Java/Android 背景,这影响了我对“成员”这个词的理解。也就是说,我开始学习 Objective-C 并且遇到了 isMemberOfClass 方法,这个名字让我很困惑。

我知道 isMemberOfClass 返回一个布尔值,指示接收者是否是给定类的实例。但是,我不明白为什么在检查它是否为实例时将其称为 isMEMBER。

关于语言协议,我不知道将其命名为有意义吗?成员在 Objective-C 中的含义是否与在 Java 中不同?

我理解成员定义的方式是,它是类 HAS(方法或数据),而不是类 IS(类型)。

任何人都可以为我清除这个看似奇怪的命名约定吗?感谢帮助新手!

4

3 回答 3

6

这里的重点是 Cocoa(和之前的 SmallTalk),不使用“成员”这个词来表示“实例变量”或“函数”或“成员”这个词在 Java 中使用的任何其他方式或C++。Harry H. Porter III有一篇关于 SmallTalk的有用论文提供了一些背景信息:

如前所述,每个对象都包含零个或多个字段。术语“字段”更可取,但其他语言使用术语“数据成员”来表示相同的概念。Smalltalk 使用术语“实例变量”来表示一个字段,因此我们说“一个对象包含多个实例变量”与“一个对象包含多个字段”或“一个对象包含多个数据成员”的含义相同。我们将交替使用术语“字段”和“实例变量”。

...

在 Java 或 C++ 中,程序员可以向任何类添加“静态数据成员”和“静态成员函数”。Smalltalk 具有类似的能力,尽管静态数据成员称为“类变量”,静态成员函数称为“类方法”。(回想一下,Smalltalk 将普通字段称为“实例变量”,并将普通成员函数称为“实例方法”。)

在 Cocoa 中,术语“成员”通常用于集合的上下文中(请参阅 参考资料[NSSet member:])。被问的问题isMemberOfClass:是“这个对象是这个特定类的所有实例的集合的成员”。

这并不是说isInstanceOfClass:会是一个不像可可的名字。只是“成员”在这里的含义与其他一些语言中的含义不同。

于 2013-09-13T18:34:45.720 回答
2

iOS 框架中不存在成员作为类(方法或数据)组件的概念。该框架还围绕冗长且通常冗长的方法或变量名称构建,以提高“增加的可读性”(在引号中,因为它不一定总是结果)。

它可以很容易地命名为isInstanceOfClass,但这可能会引起与子类的一些混淆。isMemberOfClass恰好是一个简单的方法名称,它不与 iOS 框架的任何原则相冲突,并且非常不言自明。我认为逻辑不会超出此范围。

于 2013-09-13T18:10:59.127 回答
2

我相信用于表示实例变量或方法(对不起,成员函数)的术语“成员”可以追溯到 C++。我个人从未听说过它与 Java 一起使用,但我的听力可能不是最好的。

Objective-C 几乎是 C++ 所不具备的一切——反之亦然。Objective-C 在历史上是基于并继承了该环境的大部分做事方式。引用 Smalltalk 的“发明者”之一 Alan Kay 的话说“我发明了面向对象编程,而 C++ 不是我的想法”,只是为了说明两个阵营之间的感情。

所以回答你的问题:是的,“成员”在 Objective-C 和 C++ 中具有不同的含义,如果您在深入了解 Objective-C 时发现其他具有不同含义的词,请不要太惊讶。

于 2013-09-13T18:35:55.733 回答