C++如何在派生类上进行依赖项注入

C++ How to do dependency injection on a derived class?

本文关键字:依赖 注入 派生 C++      更新时间:2023-10-16

我有一个从抽象类a派生的基类B。拥有抽象类a的想法是在单元测试时促进依赖注入和Mocking。所以A没有实现。几乎像C#接口。一切都很好。

现在我有一个从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"; }
};

在这里看到它的工作:Videone


看起来我可能误解了你想要什么。您似乎希望能够继续只使用A指针。在这种情况下,我会向A添加一个虚拟D_Work()函数,该函数抛出:

class A {
public:
virtual string Identify() = 0;
virtual string D_Work() { throw; } // If it's not defined, throw
};

在这里看到它的工作:Videone

另一种方法是在A中有多个接口I、J、K和纯方法,如GetI((,它们返回指向该接口的指针。

然后,所有实现类都实现了A,再加上任何其他接口和任何GetX((方法。

您的接口是A、I、J、K,这就是所公开的全部内容。这就是所有需要嘲笑的地方。

最终,不断更新A以添加新类会让人厌烦,因此您需要投资一种不同的获取接口的机制,可能基于接口类中声明的令牌,以及A中的一个模板方法,该方法通过调用执行相同操作的实现方法来解析令牌和返回类型。或者干脆放弃,让调用者dynamic_cast调用接口。

不久的将来,你会遇到COM,或者类似的东西。

class A;
{
virtual String Identify() = 0;
virtual I* GetI() { return nullptr;}
virtual J* GetJ() { return nullptr;}
virtual K* GetK() { return nullptr;}
};
class I
{
virtual void Work() =0;
};
class J
{
virtual void MoreWork() =0;
};
class B: A, I
{
void Work() {}
I* GetI() { return this;}
};
class C: A, J
{
void MoreWork() {}
I* GetJ() { return this;}
};