C# oop:具体情况下的组合或继承
我们刚刚与学院讨论了以下样式是否适用于oop 我们有一个类,它有一个公共函数,并且在构造函数中需要一个读取器:C# oop:具体情况下的组合或继承,c#,oop,C#,Oop,我们刚刚与学院讨论了以下样式是否适用于oop 我们有一个类,它有一个公共函数,并且在构造函数中需要一个读取器: public class Converter { private readonly IReader _reader; public Converter(IReader reader) { _reader = reader; } public byte[] Convert(...params...) {
public class Converter
{
private readonly IReader _reader;
public Converter(IReader reader)
{
_reader = reader;
}
public byte[] Convert(...params...)
{
return something;
}
}
我们有Reader1和Reader2,它们都实现了IReader
我想设置两个管理器:Converter1和Converter2,提供相同的public Convert()函数,但是Converter1将使用Reader1,Converter2将使用Reader2
对我来说,最简单的解决方案是从转换器继承并使用适当的读取器初始化它:
public class Converter1 : Converter
{
public Converter1():base(new Reader1())
{}
}
public class Converter2 : Converter
{
public Converter2():base(new Reader2())
{}
}
我的学院说,Converter1和Converter2是管理者,继承不应该用于管理者,我们应该在这里应用一个组合。但从我的角度来看,合成只会在特定的转换器类中产生额外的代码
所以,请您提出建议,在实现管理器时使用继承是否合适?
在我看来,这是对继承权的滥用。您不是专门研究转换器的行为,而是专门研究结构 特别是,您可以轻松地拥有一个带有静态方法的静态类来执行此构造:
public static class Converters
{
public static Converter CreateConverter1()
{
return new Converter(new Reader1());
}
public static Converter CreateConverter2()
{
return new Converter(new Reader2());
}
}
当然,这些方法甚至可以是普通转换器类中的静态方法
这不会失去任何功能,这一事实向我表明继承是一个错误
再说一次,我经常怀疑继承权。正确地设计继承意味着计算出扩展点,记录它们应该如何行为——这是一种平衡行为,既要为调用方提供足够的信息来预测一致的行为,又要为实现者提供足够的回旋空间来以有用的方式改变行为。在这里,您没有执行任何操作-您只是更改传递给构造函数的读取器。为什么要继承
根据您提供的示例,除了确保Converter1/Converter2强制执行特定类型的读取器之外,您没有对基类做任何额外的操作
我觉得你的同事是对的。您应该执行的是实现工厂方法,该方法将为您创建并填充正确配置的转换器
i、 e
要么使用继承(如您所建议的),要么只使用一个将与多态IReader一起工作的转换器类 静态方法不是这种情况,因为我需要将那些Converter1/Conerter2推送到其他类的构造函数中,并且调用静态方法是不可单元测试的。将工厂注入消费者阶层也是太多了。我确实需要两个管理器类,但您可能是对的,这种继承在这里不是最好的
public static class ConverterFactory {
public static CreateConverter1() {
return new Converter(new Reader1());
}
public static CreateConverter2() {
return new Converter(new Reader2());
}
}
...
Converter x = ConverterFactory.CreateConverter1();