C++和Objective C中的多态性

4

我刚接触Objective C,想更清楚地了解protocol的概念。

@protocol protocolName

@optional

@required

@end

我可以把@optional部分与C++中的虚函数相关联,将@required部分与纯虚函数相关联吗?

@protocol是Objective-C创建接口抽象类的方式吗?


它们做非常相似的事情。它们之间有微妙的差异;一个 Objective-C 对象可以实现许多不相关的协议,而且它不必从任何其他类继承;它只需要实现这些函数(最好声明它实现了这些协议,但这并不是必须的)。 - mah
它们就像Java中的接口。 - Todd Lehman
2个回答

5

@protocol是Objective-C创建接口和抽象类的一种方式,对吗?

没错。

我能将@optional部分与C++中的虚函数联系起来,将@required部分与C++中的纯虚函数联系起来吗?

可以,但有一个区别 - 如果classA没有实现OptionalProtocolMethodB,则尝试调用[classA OptionalProtocolMethodB]将导致运行时异常。在C ++中调用虚函数不会导致这种情况。

在调用可选方法之前,应检查类是否实现了该方法。例如:

if ([_delegate respondsToSelector:@selector(didUploadedTotalBytes: totalBytesExpectedToWrite:)]) {
    [_delegate didUploadedTotalBytes:_uploadedBytes totalBytesExpectedToWrite:_totalBytes];
}

5
忘记在Objective-C中使用抽象类(因为没有这个概念)。忘记与类层次结构有关的协议。
协议描述了对象需要实现的一组方法,以便用于某些目的。例如,如果协议有两个必需的方法“color”和“setColor”,那么实现这两个方法的任何类的任何实例都可以使用。此外,该类必须声明它支持该协议-这避免了类被意外使用。另一方面,协议中的所有方法都可以是可选的,一个类可以声称支持协议而不实现任何方法。
通常会描述未实现可选方法时发生的情况。例如,返回BOOL的可选方法的文档可能会说“如果未实现,则假定该方法返回YES”。在其他情况下,文档可能会说明在哪些情况下将调用可选方法。无论如何,在调用之前,调用者必须检查可选方法是否已实现,使用“respondsToSelector”。(当然,文档可能会说明例如如果wantsComplexBehaviour返回YES,则必须实现doComplexBehaviour1和doComplexThings2,不实现它将是一种程序员错误,当方法被调用时会引发异常)。
这通常都是以非常实用的方式完成的。您使用的许多类需要实现某个协议的委托对象,因此您可以将协议方法添加到自己的实现中并成为委托,或者创建一个仅用于创建这些委托的类,并在该类的实现中实现所有协议方法。

乍一看,Objective C似乎很容易,但是随着我学习的深入,有很多东西需要学习。它并不比C++容易。感谢说明。 - Pranit Kothari
这个答案更好地解释了Objective-C的哲学。理解这些概念对成为一名有效的Objective-C开发人员非常重要。 - Mike Mertsock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接