C#中静态接口方法的替代方案

3
我有以下情况:我想通过结构来识别CSV文件。结构可以简单地指“列名”,但人们可以想象更复杂的结构定义,其中包括CSV文件的更多属性。例如,“列名和分隔符”或“文件名符合某种模式”等。
这就是为什么我想创建一个接口,所有表示这种结构定义的类都需要实现该接口。最简单的定义将是:
interface ICSVFormatDefinition {
    bool isFileInThisFormat(string filename);
}

然而,现在我想要一个静态方法来分析文件中需要定义结构的元素,并返回相应的结构类。代码如下:

interface ICSVFormatDefinition {
    bool isFileInThisFormat(string filename);
    static ICSVFormatDefinition createFormatFromFile(string filename);
}

在此示例中,createFormatFromFile的方法在每个接口实现中肯定都不相同,因为有些接口只查看文件名,而另一些可能查看列名等其他信息。
但是,在C#中,您无法声明接口中的静态方法。您也无法将其声明为接口中的实例方法并将其实现为静态方法。
我的问题现在是:
  • 我猜这是不好的设计,因为C#不允许我执行它。 但为什么是不好的?
  • 强制所有结构定义类(实现ICSVFormatDefinition)具有创建自身新实例的方法的适当方式是什么?
提前感谢!
2个回答

4
  1. 接口声明对象的行为。静态方法不是对象的方法,而是类的方法。因此,类没有行为,只有一些实用方法。
  2. 您可以创建一个工厂类,或者声明非静态工厂方法。我认为,第二种方式对您的情况更好。如果您的解决方案取决于createFormatFromFile方法,则最好在接口中声明并且是非静态的。

1
Interface的主要目的是定义与对象交互的契约。
静态方法不是为了对象而存在的,它们是为了类而存在的。
您可能把createFormatFromFile()方法放错了位置。关于对象创建,我建议使用工厂/抽象工厂/生成器设计模式。
链接: http://www.dofactory.com/net/factory-method-design-pattern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接