我想创建一个实现两个接口的类,这两个接口具有相同名称的函数,它们的返回值不同。我怎样才能正确地做到这一点?
template<class T>
class IBase
{
public:
virtual T Method() = 0;
};
class Derived : public IBase<int>, public IBase<char> {
public:
int _value;
virtual int IBase<int>::Method();
virtual char IBase<char>::Method();
};
int Derived::Method() {
return _value;
}
char Derived::Method() {
return _value;
}
以下是我得到的错误:
error C2555: 'Derived::Method: overriding virtual function return type differs and is not covariant from 'IBase<int>::Method
error C2556: 'int Derived::Method(void)' : overloaded function differs only by return type from 'char Derived::Method(void)'
error C2371: 'Derived::Method: redefinition; different basic types
error C2084: function 'char Derived::Method(void)' already has a body
在 C# 中,使用几乎相同的语法(称为显式接口实现)很容易做到这一点,没有任何歧义:
class Derived : IBase<int>, IBase<char> {
int _value;
int IBase<int>.Method() {
return _value;
}
char IBase<char>.Method();
return _value;
}
};
显式实现是私有的,因此不能直接用于 class 的变量Derived
。它们仍然非常有用,因为您可以将其Derived
转换为接口之一以使用实现:
var d = new Derived();
((IBase<int>)d).Method();
这可能相当有用。一个类可以多次实现 ICanConvertTo 以启用不同的转换。