我怎样才能使 class 实现一个接口.... (C++)
How can I make a class implement an interface .... (C++)
...当 class 实际上确实提供了所有抽象方法的实现,但不是 "formally" 实现了接口?
假设我有以下内容:
class AInterface {
public:
virtual void mem_func()=0;
virtual ~AInterface(){}
};
void AFunction(AInterface* i){};
class BClass {
public:
void mem_func(){}
virtual ~BClass(){}
};
我无法更改其中任何内容,但我想使用 class BClass 的对象来调用 AFunction。
其实我想写点像
class MyABClass : public BClass,public AInterface {};
但这没有帮助(class 只是继承了这两种方法并且是抽象的)。我猜想做到这一点的一种方法是写一些类似
的东西
class MyABClass : public AInterface {
public:
void mem_func(){a.mem_func();}
private:
BClass a;
}
这很好,但我想知道是否可以节省一些写作,或者是否有更好的方法来处理这种情况。
你的第一次尝试几乎是正确的
class MyClass : public AClass,public AInterface {};
问题是 MyClass 不知道 AClass::A() 满足 AInterface::A()=0 提出的要求。像这样给它一点帮助
class MyClass : public AClass, public AInterface {
void A() {AClass::A();}
};
我会使用与您上一个代码片段非常相似的方法
class MyABClass : public AInterface {
public:
void MyABClass(BClass &_a)
: a(_a)
{}
void mem_func(){a.mem_func();}
private:
BClass &a;
}
这是一种设计模式,称为 Adapter (with delegation). Maybe you also want to read about the Proxy 模式。
Update(考虑 Kenny 的评论):是否将 BClass
作为参考或副本传递是值得商榷的。这取决于你想要什么。如果你想要一个包装器来方便地改变原始 BClass
实例,那么使用 BClass &
作为构造函数参数。另一方面,如果一个副本就足够了,那么只使用 BClass
而没有符号 &
。好吧,if 复制构造函数可用。最后,在使用可能会产生副作用的引用时必须注意(同样,可能需要也可能不需要)。
...当 class 实际上确实提供了所有抽象方法的实现,但不是 "formally" 实现了接口?
假设我有以下内容:
class AInterface {
public:
virtual void mem_func()=0;
virtual ~AInterface(){}
};
void AFunction(AInterface* i){};
class BClass {
public:
void mem_func(){}
virtual ~BClass(){}
};
我无法更改其中任何内容,但我想使用 class BClass 的对象来调用 AFunction。
其实我想写点像
class MyABClass : public BClass,public AInterface {};
但这没有帮助(class 只是继承了这两种方法并且是抽象的)。我猜想做到这一点的一种方法是写一些类似
的东西class MyABClass : public AInterface {
public:
void mem_func(){a.mem_func();}
private:
BClass a;
}
这很好,但我想知道是否可以节省一些写作,或者是否有更好的方法来处理这种情况。
你的第一次尝试几乎是正确的
class MyClass : public AClass,public AInterface {};
问题是 MyClass 不知道 AClass::A() 满足 AInterface::A()=0 提出的要求。像这样给它一点帮助
class MyClass : public AClass, public AInterface {
void A() {AClass::A();}
};
我会使用与您上一个代码片段非常相似的方法
class MyABClass : public AInterface {
public:
void MyABClass(BClass &_a)
: a(_a)
{}
void mem_func(){a.mem_func();}
private:
BClass &a;
}
这是一种设计模式,称为 Adapter (with delegation). Maybe you also want to read about the Proxy 模式。
Update(考虑 Kenny 的评论):是否将 BClass
作为参考或副本传递是值得商榷的。这取决于你想要什么。如果你想要一个包装器来方便地改变原始 BClass
实例,那么使用 BClass &
作为构造函数参数。另一方面,如果一个副本就足够了,那么只使用 BClass
而没有符号 &
。好吧,if 复制构造函数可用。最后,在使用可能会产生副作用的引用时必须注意(同样,可能需要也可能不需要)。