所以说我有以下
A类定义为
Class A : public Class B
{};
我将如何以编程方式更改它以使其成为Class A : public Class C
?
理由是我希望C类是用于单元测试目的的B类简化版本。所以我需要一种方法来生成一个A类版本,而不修改A类,然后使用C类的方法,而不是B类。
希望这有意义吗?
答案 0 :(得分:1)
您可以使用模板并在编译时更改它:
template<typename T>
class AT: public T { /* ... */ };
现在,在某个地方,你可以这样做:
#ifdef DEBUG
using A = AT<C>;
#else
using A = AT<B>;
#endif
否则,如果你想在运行时这样做,你应该使用组合而不是继承,例如:
struct A {
I subclass;
};
// ...
struct B: I {};
struct C: I {};
这样做,您可以在软件中引入一个触发器,只是强制在B
的实例中注入C
或A
的实例。
只要A
的实例将其请求转发给基础类,与派生的请求无关,那么它的界面就很重要。
回答实际问题:您无法在运行时更改基类的类型
如果A
继承自B
,那就是全部。
答案 1 :(得分:0)
根据您的评论,有几个答案,但真正的答案是不使用继承。
使用构图:
class wrapper
{
thing_you_want_to_mock& thingie;
// all the wrapped functionality
};
在这里,您可以创建一个模拟thing_you_want_to_mock
,并使用模拟对象测试包装器。这里的问题是我假设thing_you_want_to_mock
有一个可覆盖的界面,这可能不是你的情况。
使用模板化合成:
template<typename ThingYouWantToMock>
class wrapper
{
ThingYouWantToMock thing;
// Wrapper functions that call functions on thing
};
两者都是......战略模式的例子!以某种形式或其他形式。