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

时间:2015-02-26 11:07:52

标签: oop inheritance interface abstraction

我创建了以下界面:

public interface IReader
{
    string Read();
}

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

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

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

另一种选择可能是使用带有参数的Read()方法创建一个单独的接口。

这种情况的优秀设计是什么?

2 个答案:

答案 0 :(得分:1)

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

那就是说,我不认为你的设计是合理的:什么会返回XmlReader.Read方法?请记住,界面的用户应该忽略它使用的具体类。因此,在调用IReader.Read()之后,它不应该根据文件的类型对字符串做不同的详细说明。这是你的情况吗?

在我看来,你想要捕捉的变化不是"阅读文件"部分,但"如何获得正确的文件阅读"。在这种情况下,接口带有" Read"方法没用。

在任何情况下:IReaderXmlFileReaderFileReader都是您班级的错误名称。你应该避免使用-er后缀:见this good article。请记住,继承应该模拟IS-A关系。

答案 1 :(得分:0)

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

以下是模式的详细说明 Strategy pattern explained