我们刚刚与大学讨论过以下风格是否可以被 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/