扩展接口而不必重新实现其功能
Extend an interface whilst not having to reimplement its functions
我在接口继承方面遇到了一些困难。我想要实现的是,我想扩展一个接口,同时不必通过重用父接口实现中的函数实现来重新实现它的所有函数。这可能吗?
所以假设我有两个接口,第二个 (IB) 继承自第一个 (IA)
class IA
{
public:
virtual void funcA() const = 0;
};
class IB : public IA
{
public:
virtual void funcB() const = 0;
};
class AImpl : public IA
{
public:
virtual void funcA() const override {std::cout << "funcA from AImpl" << std::endl;};
};
class BImpl: public IB
{
public:
virtual void funcA() const override {std::cout << "funcA from BImpl" << std::endl;};
virtual void funcB() const override {std::cout << "funcB" << std::endl;};
};
int main()
{
BImpl b = BImpl();
b.funcA();
b.funcB();
return 0;
}
这显然给了我预期的输出
funcA from BImpl
funcB
然而,我更愿意拥有的是 BImpl 使用 AImpl 的 funcA 实现(好像它只会继承 AImpl):
funcA from AImpl
funcB
我试图让 BImpl 继承自 IB 和 AImpl,但这不起作用(如果我不再实现 funcA,BImpl 将变得抽象)。我没有让 BImpl 仅继承 AImpl 并添加 funcB 的原因是我希望有一个单独的接口 (IB) 来针对 BImpl 类型的对象进行编码,同时允许我调用 funcA无需将对象转换为 IA 类型(因此接口继承)。
// 编辑开始(3 月 10 日)
也就是说,我希望我的业务逻辑看起来像这样
int main()
{
IB* b = new BImpl();
b->funcA();
b->funcB();
return 0;
}
这需要 IB
继承自 IA
。
// 编辑结束
有什么想法吗?理想情况下,我什至不必将 BImpl 中的 funcA 设为 AImpl 中 funcA 的包装器(如前所述,就好像我是单独从 AImpl 继承的一样)
使用虚拟继承利用function dominance rules.
我对支配的具体运作方式感到生疏,但在这种情况下它恰好做了正确的事情。
#include <iostream>
class IA
{
public:
virtual void funcA() const = 0;
};
class IB : public virtual IA
{
public:
virtual void funcB() const = 0;
};
class AImpl : public virtual IA
{
public:
void funcA() const override {std::cout << "funcA" << std::endl;};
};
class BImpl : public AImpl, public IB
{
public:
void funcB() const override {std::cout << "funcB" << std::endl;};
};
int main()
{
BImpl b;
b.funcA(); // funcA
b.funcB(); // funcB
return 0;
}
我在接口继承方面遇到了一些困难。我想要实现的是,我想扩展一个接口,同时不必通过重用父接口实现中的函数实现来重新实现它的所有函数。这可能吗?
所以假设我有两个接口,第二个 (IB) 继承自第一个 (IA)
class IA
{
public:
virtual void funcA() const = 0;
};
class IB : public IA
{
public:
virtual void funcB() const = 0;
};
class AImpl : public IA
{
public:
virtual void funcA() const override {std::cout << "funcA from AImpl" << std::endl;};
};
class BImpl: public IB
{
public:
virtual void funcA() const override {std::cout << "funcA from BImpl" << std::endl;};
virtual void funcB() const override {std::cout << "funcB" << std::endl;};
};
int main()
{
BImpl b = BImpl();
b.funcA();
b.funcB();
return 0;
}
这显然给了我预期的输出
funcA from BImpl
funcB
然而,我更愿意拥有的是 BImpl 使用 AImpl 的 funcA 实现(好像它只会继承 AImpl):
funcA from AImpl
funcB
我试图让 BImpl 继承自 IB 和 AImpl,但这不起作用(如果我不再实现 funcA,BImpl 将变得抽象)。我没有让 BImpl 仅继承 AImpl 并添加 funcB 的原因是我希望有一个单独的接口 (IB) 来针对 BImpl 类型的对象进行编码,同时允许我调用 funcA无需将对象转换为 IA 类型(因此接口继承)。
// 编辑开始(3 月 10 日)
也就是说,我希望我的业务逻辑看起来像这样
int main()
{
IB* b = new BImpl();
b->funcA();
b->funcB();
return 0;
}
这需要 IB
继承自 IA
。
// 编辑结束
有什么想法吗?理想情况下,我什至不必将 BImpl 中的 funcA 设为 AImpl 中 funcA 的包装器(如前所述,就好像我是单独从 AImpl 继承的一样)
使用虚拟继承利用function dominance rules.
我对支配的具体运作方式感到生疏,但在这种情况下它恰好做了正确的事情。
#include <iostream>
class IA
{
public:
virtual void funcA() const = 0;
};
class IB : public virtual IA
{
public:
virtual void funcB() const = 0;
};
class AImpl : public virtual IA
{
public:
void funcA() const override {std::cout << "funcA" << std::endl;};
};
class BImpl : public AImpl, public IB
{
public:
void funcB() const override {std::cout << "funcB" << std::endl;};
};
int main()
{
BImpl b;
b.funcA(); // funcA
b.funcB(); // funcB
return 0;
}