c# - oop:具体案例中的组合或继承

标签 c# oop

我们刚刚与大学讨论过以下风格是否可以被 oop 接受。

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

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。

对我来说,最简单的解决方案是继承 Converter 并使用适当的读取器对其进行初始化:

public class Converter1 : Converter
{
    public Converter1():base(new Reader1())
    {}
}
public class Converter2 : Converter
{
    public Converter2():base(new Reader2())
    {}
}

我的大学说,Converter1和Converter2是Manager,Manager不应该使用继承,而应该在这里应用一个组合。但从我的角度来看,组合只会导致特定转换器类中的额外代码。

那么,能否请您指点一下,在实现管理器时是否可以使用继承? 谢谢

最佳答案

你为什么要继承??

根据您提供的示例,除了确保 Converter1/Converter2 强制执行特定类型的阅读器外,您没有对基类做任何额外的事情。

在我看来,您的同事是对的。您应该做的是实现一个工厂方法,它将为您创建和填充正确配置的转换器。

public static class ConverterFactory {
    public static CreateConverter1() { 
       return new Converter(new Reader1());
    }
    public static CreateConverter2() {
       return new Converter(new Reader2());
    }
}

...
Converter x = ConverterFactory.CreateConverter1();

关于c# - oop:具体案例中的组合或继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3448169/

相关文章:

c# - 使用领域驱动设计时应用存储在数据库中的业务规则

java - 在 Eclipse 中分析 Java OO 代码

python - 在 Python 中追加列表

c++ - 使用 C++ 和 OOP 创建面积计算程序

c# - 使用 Action<T> 模拟方法

c# - 如何从 MVC 中的 View 将变量插入数据库

Java类困惑

javascript - 使用 addEventListener 调用 onclick 方法

c# - 如何实现通用 IEnumerable 或 IDictionary 以避免 CA1006?

c# - 如何在 C# 中编写文件系统观察程序?