C++ 如何对派生类进行依赖注入(inject)?

标签 c++ dependency-injection

我有一个从抽象类 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 风格)这将再次要求用户知道类型。对设计有什么想法吗?

最佳答案

您可以在BD 之间添加另一个抽象类:

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/

相关文章:

java - 如何使用 Spring 在 Hibernate 拦截器 Bean 中注入(inject) EntityManager?

c# - 什么是 IoC 子容器以及如何使用它们?

C++ 元编程问题/挑战以生成基于它的函数调用的类型

c++ - Mo算法计算数组的 "power"

c++ - 如果类数组中的 vector 是动态 push_backed,内存如何工作?

c++ - 什么会导致异常 16 : "mutex: Resource busy" to be thrown (using Boost/BB10)?

c# - 在简单注入(inject)器中延迟创建实例

php - 如何让我的 PHP IDE 理解依赖注入(inject)容器?

c++ - 定义和实现中的命名空间

c# - 如果无法进行依赖注入(inject)怎么办?