我有一个从抽象类 A 派生的基类 B。拥有抽象类 A 的想法是在单元测试时促进依赖注入(inject)和模拟。所以 A 没有实现。几乎像 C# 接口(interface)。一切正常。
现在我有一个继承自B的派生类D。现在的问题是D没有抽象类来促进DI或Mocking。这是解释问题的一小段代码:
class A // Abstract
{
public:
virtual String Identify() = 0;
};
class B : public A
{
public:
String Identify() {return "B"; }
};
class D : public B
{
public:
String D_Work() {return "D_Work"; }
};
所以要使用 B,我执行 A *b = new B();
这很好。 using 类不知道类型 B。new() 是由工厂完成的,或者只是传入对象。
但是要使用 D,我要么需要实际类型(我试图摆脱它),要么使用类型 A 并强制转换以调用 A *d = new D(); 之类的方法; ((D*)d)->D_Work())
(为简单起见,使用 c 风格)这将再次要求用户知道类型。对设计有什么想法吗?
最佳答案
您可以在B
和D
之间添加另一个抽象类:
class B : public A {
public:
string Identify() {return "B"; }
};
class C : public B {
public:
virtual string D_Work() = 0;
};
class D : public C {
public:
string D_Work() {return "D_Work"; }
};
在这里查看它的工作情况:ideone
看来我可能误解了你的意思。您似乎希望能够继续仅使用 A
指针。在这种情况下,我会向 A
添加一个虚拟 D_Work()
函数,抛出:
class A {
public:
virtual string Identify() = 0;
virtual string D_Work() { throw; } // If it's not defined, throw
};
在这里查看它的工作情况:ideone
关于C++ 如何对派生类进行依赖注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58734769/