Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# oop:具体情况下的组合或继承_C#_Oop - Fatal编程技术网

C# 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...) {

我们刚刚与学院讨论了以下样式是否适用于oop

我们有一个类,它有一个公共函数,并且在构造函数中需要一个读取器:

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();