在基础 class 上向构造函数添加一个新参数意味着我必须重构从它继承的所有 classes 吗?
Adding a new parameter to constructor on the base class means I have to refactor all of the classes that inherit from it?
我正在使用 Castle Windsor Inversion of Control Container。
我发现如果我需要通过基础 class 上的构造函数注入一个新组件,那么所有从它继承的子 classes 都需要将该组件传递给基础的构造函数.这是预期的。
但是,如果我有几十个继承自该基础的子 class,并且有数十个单元测试实例化这些子 class,那会怎样呢?我真的需要遍历并重构所有这些构造函数和对这些构造函数的调用吗?我是否缺少一种设计模式,它可以让我轻松修改基础 class 构造函数,而不必重构该 class 的所有子项?
是的。
在对 classes 进行单元测试时,您将不得不模拟依赖项并将其传递给构造函数。
我假设继承基础 class 的所有子级都使用该依赖项,那么您为什么不希望将其传入?
我认为解决您问题的直接方法是将基础 class 的依赖项打包到新的 class 中,例如 BaseDependencies
,基础 class依赖,在这种情况下,如果基础 class 有一个新的依赖,你只需要向 BaseDependencies
添加一个新成员。
代码将是这样的:
class Base {
public Base(BaseDependencies d) {}
}
class BaseDependencies {
public DependencyA {get; set;}
public DependencyB {get; set;}
public DependencyC {get; set;}
}
另一个选项可能是通过 class 组合而不是继承来重构您的代码以重用逻辑。
参见:https://en.wikipedia.org/wiki/Composition_over_inheritance
Am I missing a design pattern [...]?
是的,使用接口而不是基础类。接口没有构造函数,所以你永远不会 运行 遇到接口的那种问题。
Anything you can do with a base class, you can also do with composition.
我正在使用 Castle Windsor Inversion of Control Container。
我发现如果我需要通过基础 class 上的构造函数注入一个新组件,那么所有从它继承的子 classes 都需要将该组件传递给基础的构造函数.这是预期的。
但是,如果我有几十个继承自该基础的子 class,并且有数十个单元测试实例化这些子 class,那会怎样呢?我真的需要遍历并重构所有这些构造函数和对这些构造函数的调用吗?我是否缺少一种设计模式,它可以让我轻松修改基础 class 构造函数,而不必重构该 class 的所有子项?
是的。
在对 classes 进行单元测试时,您将不得不模拟依赖项并将其传递给构造函数。
我假设继承基础 class 的所有子级都使用该依赖项,那么您为什么不希望将其传入?
我认为解决您问题的直接方法是将基础 class 的依赖项打包到新的 class 中,例如 BaseDependencies
,基础 class依赖,在这种情况下,如果基础 class 有一个新的依赖,你只需要向 BaseDependencies
添加一个新成员。
代码将是这样的:
class Base {
public Base(BaseDependencies d) {}
}
class BaseDependencies {
public DependencyA {get; set;}
public DependencyB {get; set;}
public DependencyC {get; set;}
}
另一个选项可能是通过 class 组合而不是继承来重构您的代码以重用逻辑。 参见:https://en.wikipedia.org/wiki/Composition_over_inheritance
Am I missing a design pattern [...]?
是的,使用接口而不是基础类。接口没有构造函数,所以你永远不会 运行 遇到接口的那种问题。
Anything you can do with a base class, you can also do with composition.