2015-02-26 37 views
0

我已经创建了下面的接口的多个实施方式和混乱:接口,具有大约参数

public interface IReader 
{ 
    string Read(); 
} 

一种实现这一点,是一个封装的逻辑读入基于存储在所述的路径上从磁盘XML文件的XmlFileReader配置文件。

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

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

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

什么是这种情况下的好设计?

+0

为什么你认为两个不同的调用应该是相同的抽象? – Euphoric

+0

原因是它是相同的操作,即读取操作。区别在于路径是由调用者提供的还是从配置文件中提取的。你有什么建议? –

+1

如果调用者提供的参数不同,则它们是不同的操作。仅仅因为他们被称为相同的名称并不会使他们相同。 – Euphoric

回答

1

的规范的解决办法是把参数在具体类的构造的详细说明。

这就是说,我不认为你的设计是健全的:返回XmlReader.Read方法是什么?请记住,接口的用户应该忽略它使用的具体类。因此,在拨打IReader.Read()后,不应根据文件类型对字符串进行不同的详细说明。这是你的情况吗?

在我看来,你想捕获的变化不是“读取文件”部分,而是“我如何获得正确的文件读取”。在这种情况下,具有“读取”方法的接口是无用的。

在任何情况下:IReaderXmlFileReaderFileReader对于您的课程而言确实是很糟糕的名称。您应该避免-er后缀:请参阅this good article。请记住,继承应该模拟一个IS-A关系。

0

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

这里是图案 Strategy pattern explained

+0

请举个例子。 –

+0

链接中有一个很好的例子。你有看到它吗? –

+0

是的,我确实看到了,但是在我的场景中没有多大意义。不管怎么说,多谢拉 ! –