这是反模式吗?

时间:2012-06-20 15:19:45

标签: c# design-patterns inheritance anti-patterns

我经常看到这样的代码:

public abstract class AbstractDataReader
{
    public void Read()
    {
        var reader = new StreamReader(FileName);
        ........
    }

    protected abstract string FileName
    {
        get;
    }
}

public class DataReader : AbstractDataReader
{
    protected override string FileName
    {
        get { return "data.txt"; }
    }
}

至于我,它接缝为反模式,因为DataReader类没有逻辑,我不能使用AbstractDataReader而不继承它,我也必须继承该类只是为了指定参数和我的工作速度也比较慢,只需将参数放在构造函数中即可。

但我找不到这种反模式的名称。

有人知道吗?

2 个答案:

答案 0 :(得分:6)

是的,这是一种反模式。抽象类已经强制派生类如何工作,这里对于单个类的类层次结构没有任何优势。

如果抽象类调用纯虚函数来获取StreamReader,那么它就有意义了。然后,不同的派生类可以附加到文件,网络流或动态生成的数据。

这里的反模式是“违反开放原则”(SOLID的第二部分)。

答案 1 :(得分:0)

是/否。

对我而言,这看起来像是抽象二传手注射的尝试,我不确定这是一个好主意。它使得事情不清楚并导致代码发布,但是setter注入本身并不是反模式。