C++如何在派生类上进行依赖项注入
C++ How to do dependency injection on a derived class?
我有一个从抽象类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样式(,这同样需要用户知道类型。对设计有什么想法吗?
您可以在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"; }
};
在这里看到它的工作: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;}
};
- 如何在不诉诸依赖注入的情况下模拟遗留函数?
- 正确构造和销毁 Setter 依赖注入对象(可能使用 qt)
- 依赖注入:依赖关系需求字段/成员
- 模板或链接接缝依赖注入有哪些替代方案来测试非虚拟方法?
- 类型擦除代码的依赖注入单元测试
- 包装类设计和依赖注入
- 在进行依赖注入时公开私有方法
- 有趣的C++依赖注入方案
- 使用X3对解析器的依赖注入
- 我如何使用Gmock进行依赖注入
- 重构Singleton/Globals以使用依赖注入进行单元测试
- 依赖注入/继承设计模式的构造函数参数太多
- 依赖注入 + 完全虚拟与接口
- 依赖注入,unique_ptr模拟
- 构造函数依赖注入:unique_ptr + move vs shared_ptr
- 为什么更喜欢模板方法而不是依赖注入
- c++依赖注入:对象生命周期
- 我可以在依赖注入中使用std::unique_ptr吗?
- 工厂类的依赖注入
- c++依赖注入+得墨忒耳定律+ logger/assert