与多个实现的接口和对参数的混淆

Interface with multiple implementations and confusion about parameters

我创建了以下界面:

public interface IReader
{
    string Read();
}

它的一个实现是 XmlFileReader,它封装了根据存储在配置文件中的路径从磁盘读取 xml 文件的逻辑。

它的另一个实现是 FileReader,它会根据指定为参数的路径从磁盘读取文件。

现在的困惑是,XMLFileReader 不需要 Read() 方法中的任何参数,而 FileReader 需要。我是否应该向 IReader.Read() 方法添加一个可选参数,以便在 FileReader 的情况下我可以使用该参数提供文件路径,而在 XMLFileReader 的情况下不使用该参数?

另一种选择可能是创建一个单独的接口,其中包含采用参数的 Read() 方法。

对于这种情况,什么是好的设计?

我认为你可以使用策略模式。它将算法隔离在单独的 类 中,以便能够在运行时 select 不同的算法。

这里是模式的详细描述 Strategy pattern explained

规范的解决方案是将参数放在具体 classes 的构造函数中。

也就是说,我认为您的设计不合理:return 和 XmlReader.Read 方法是什么?请记住,接口的用户应该忽略它正在使用的具体 class。所以,在调用IReader.Read()之后,它不应该根据文件的类型对字符串做不同的阐述。这是你的情况吗?

在我看来,您要捕获的变化不是 "Read the file" 部分,而是 "How do I get the right file to read" 部分。在这种情况下,带有 "Read" 方法的接口是无用的。

无论如何:IReaderXmlFileReaderFileReader 对您的 class 来说都是非常糟糕的名字。您应该避免使用 -er 后缀:请参阅 this good article。请记住,继承应该为 IS-A 关系建模。