C++和Objective C中的多态性

Pra*_*ari 4 c++ polymorphism objective-c

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

@protocol protocolName

@optional

@required

@end
Run Code Online (Sandbox Code Playgroud)

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

@protocolObjective-C创建接口抽象类的方式吗?

Avt*_*Avt 5

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

究竟.

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

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

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

if ([_delegate respondsToSelector:@selector(didUploadedTotalBytes: totalBytesExpectedToWrite:)]) {
    [_delegate didUploadedTotalBytes:_uploadedBytes totalBytesExpectedToWrite:_totalBytes];
}
Run Code Online (Sandbox Code Playgroud)


gna*_*729 5

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

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

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

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