繁体   English   中英

C ++和Objective C中的多态性

[英]Polymorphism in C++ and Objective C

我是Objective C的新手,我想更清楚地理解protocol概念。

@protocol protocolName

@optional

@required

@end

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

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

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

究竟。

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

是的,你可以,但有一个区别 - 如果classA没有实现OptionalProtocolMethodB,任何调用[classA OptionalProtocolMethodB]的尝试都将导致运行时异常。 在C ++中调用虚函数不会。

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

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

忘掉Objective-C中的抽象类(没有)。 忘记与类层次结构相关的协议。

协议描述了一组对象需要实现以用于某些目的的方法。 例如,如果协议具有两个必需的方法“color”和“setColor”,则可以使用实现这两种方法的任何类的任何实例。 此外,该类必须声称它支持协议 - 这避免了巧合使用的类。 另一方面,协议中的所有方法都可以是可选的,并且类可以声称支持协议而不实现任何方法。

通常会描述未实现可选方法时会发生什么。 例如,返回BOOL的可选方法的文档可能会说“如果未实现,则假定该方法返回YES”。 在其他情况下,文档可能会说在哪种情况下将调用可选方法。 在任何情况下,调用者必须在使用“respondsToSelector”调用它之前检查是否实现了可选方法。 (当然,文档可能会说,例如,如果wantsComplexBehaviour返回YES,那么必须实现doComplexBehaviour1和doComplexThings2,而不实现那个程序员错误会在调用方法时因异常而受到惩罚)。

这通常都是以非常务实的方式完成的。 您使用的许多类都需要委托实现某些协议的对象,因此您可以将协议方法添加到您的实现中并使自己成为委托,或者您创建一个类的唯一目的是创建这些委托并实现所有协议方法。该类的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM