您的示例的 C++ 等效项如下所示:
// A.hpp
#include "B.hpp"
class A : public BDelegate {
public:
void classBSays ( ) { }
B* b;
};
// B.hpp
class BDelegate {
public:
virtual void classBSays( ) = 0;
};
class B {
public:
void f ( ) { delegate->classBSays( ); }
BDelegate* delegate;
};
请注意,为了简洁起见,我在这里使用了成员函数的内联实现 - 如果需要,您可以同样在单独的文件中实现A.classBSays()
和。B.f()
A.cpp
B.cpp
在此示例中,该类BDelegate
是一个抽象基类 (ABC),相当于您的BDelegate
协议。通过只包含纯虚成员函数(以关键字virtual
和=0
后缀开头的函数),它强制其子类为这些方法提供实现,就像@required
在 Objective-C 协议中使用标签(或无标签)所做的那样。BDelegate
仅包含此类功能的事实使其成为 ABC。
您可以通过在 ABC 中为函数指定一个空主体来模拟 Objective-C@optional
标记,这意味着不需要子类来实现它(因为它是在 ABC 中实现的)。例如,您可以通过如下foo
修改来模拟可选方法:BDelegate
@protocol BDelegate
- (void) classBsays;
@optional
- (void) foo;
@end
// Is approximately equivalent to:
class BDelegate {
public:
virtual void classBSays( ) = 0;
virtual void foo( ) { }
};
使用该定义,类A
可以根据需要选择是否提供定义foo
。但是请注意,这并不完全等同于 Objective-C@optional
表示法,因为如果它不提供自己的覆盖,它A
仍然会继承BDelegate
'方法。foo
另一方面,Objective-C 协议A
根本没有这样的方法,除非它自己显式地实现它。
可在此处获得对该主题的更全面介绍。