假设我有一个基本接口,以及从基本接口派生的其他几个接口,但也指定了其他方法,并且任何两个接口中没有两个方法共享名称或签名。所以,例如,像这样:
class Top
{
public:
virtual ~Top() {}
virtual void test() = 0;
};
class MiddleA : public virtual Top
{
public:
virtual ~MiddleA() {}
virtual void testA() = 0;
};
class MiddleB : public virtual Top
{
public:
virtual ~MiddleB() {}
virtual void testB() = 0;
};
class Bottom : public MiddleA, public MiddleB
{
public:
void test() override
{
std::cout << "Invoked test()" << std::endl;
}
void testA() override
{
std::cout << "Invoked TestA()" << std::endl;
}
void testB() override
{
std::cout << "Invoked TestB()" << std::endl;
}
};
我的目的是指定一个“基础”类型,并且具有与该基本接口不同种类的其他接口,但也添加其他正交功能,并允许实现基本接口功能的某些内容也实现一个或多个顶部的其他接口。
虽然虚拟继承显然是以我在我的例子中展示的天真方式实现这一点,但我想避免这种开销。还有另一种方法可以实现这种功能聚合,同时避免虚拟继承吗?我特别需要让中间接口也是基接口的子接口,这样仍然可以使用指向中间类的指针来访问基接口的功能。
这就是Java界面非常有用的地方。