我刚刚开始接触 Objective-C(Java 是我的主要面向对象语言)。
在接口而不是类中定义对象的实例变量似乎很奇怪。我习惯了接口作为公共 API 定义,除了方法签名之外什么都没有(这里不包括常量)。
是否有某种原因导致状态在接口中定义(即使它是私有的)而行为在类中定义。这似乎很奇怪,因为对象是状态+行为,所以定义将被分成两个单独的地方。
这是某种设计上的好处吗?您在 Objective-C 中被迫处理的后问题?不是问题,只是不同?为什么这样做有任何背景吗?
或者你可以将对象状态放入一个类中,而我在我的书中还没有触及这一部分吗?
UPDATE
下面的答案是在实现中声明实例变量的语言功能实现之前编写的。现在问题的前提不再有效。作为火蜥蜴 https://stackoverflow.com/users/762175/firelizzard说,没有什么需要进入@interface
你不想公开。
这是由于 Objective-C 最初是建立在 C 之上的一个相当薄的层这一事实的一个遗留问题。C 的方法是定义模块的接口(不要与 Java 的接口混淆)interface
)在头文件中并逐字地将其包含在每个编译单元中。这类似于自动将声明复制粘贴到每个编译文件的顶部。如果这看起来很原始,那是因为它确实很原始,但 C 是一门有 40 年历史的语言。
您必须在接口中定义实例变量(甚至是私有变量),因为 Objective-C 对象被实现为 C 结构体,它们本身只是内存块和该块内的命名偏移量。表示每个类的对象的结构必须包含用于超类实例变量的空间,因此子类至少需要知道表示超类的 C 结构体的大小以及公共和受保护的实例变量偏移量。不幸的是,这意味着所有实例变量,甚至私有变量都必须作为外部接口的一部分公开。* C++,C 的其他 OO 版本,由于同样的原因,也遇到了同样的问题。
必须两次写下所有方法签名有点痛苦,但你会习惯的。
*使用 64 位运行时,您不再需要在@interface
但由于所有方法都是公共的,它仍然意味着将内部状态暴露给外部世界,尽管它确实缓解了脆弱的基类 http://en.wikipedia.org/wiki/Fragile_base_class问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)