【发布时间】:2011-05-21 10:54:21
【问题描述】:
简单的答案是协议。
另外一点,据说ObjectC中的所有方法都是虚的,所以在ObjC中就不用说虚了。
我很难理解这个概念。
有没有 cmets 可以更清楚地解决这个问题?
感谢您的评论。
【问题讨论】:
标签: c++ objective-c virtual protocols
简单的答案是协议。
另外一点,据说ObjectC中的所有方法都是虚的,所以在ObjC中就不用说虚了。
我很难理解这个概念。
有没有 cmets 可以更清楚地解决这个问题?
感谢您的评论。
【问题讨论】:
标签: c++ objective-c virtual protocols
简单的答案是协议。
简单但错误。协议是一种接口规范。它是一个对象必须响应的消息集合(暂时忽略@optional 关键字)。
“虚拟函数”一词在 Objective-C 中没有直接对应的词。在 Objective-C 中,您不会在对象上调用函数,而是向它们发送消息。然后对象本身决定如何响应消息,通常通过在其类对象中查找消息,找到关联的方法并调用它。请注意,这一切都发生在运行时,而不是编译时。
消息(或“选择器”以赋予它们技术术语)和方法之间的映射完全由@implementation 构建。 @interface 中的方法声明仅用于为编译器提供所需的信息,以警告您您可能忘记了方法实现。这只是一个警告,因为直到运行时您才知道对象是否真的响应消息。例如,其他人可以向现有类添加一个类别,为缺少的方法提供实现,或者一个类可以覆盖 forwardingTargetForSelector: 以转发它在其他地方不响应的消息。
【讨论】:
obj_msg_send 的参数之一,对象确实决定在运行时如何处理它。对于 C++,这不能说。我并不是说 Objective-C 的方式一定更好,但它是根本不同的。
Objective-C 中对象上的方法不是虚函数,它们是实函数。
我不敢苟同,Obj-C 中的方法并不像人们想象的那样真实。它们的行为就像 C++ 中的虚函数一样,除了你不能在 Objective-C 中创建一个“纯虚”函数。
干杯, 拉克西特
【讨论】: