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

时间:2016-08-11 12:37:04

标签: c# interface static

我有以下情况:我想根据其结构识别CSV文件。结构可以简单地表示“列名称”,但可以想象更复杂的结构定义,其中包括CSV文件的更多属性。例如“列名和分隔符”或“文件名满足模式”等等。

这就是为什么我想创建一个接口,代表这种结构定义的所有类都需要实现。最简单的定义是:

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

但是现在我想要一个静态方法来分析定义结构所需的文件元素并返回一个拟合结构类。像这样:

createFormatFromFile

此示例中的something.value = getVariable('id'); // { id : 'Adam Smith' } 方法当然在接口的每个实现中都是不同的,因为只查看文件名,而另一个可以查看列名等等。

但是,您无法在C#中的接口中声明静态方法。您也不能在接口中将其声明为实例方法并将其实现为静态。

我现在的问题是:

  • 我想这是糟糕的设计,因为C#不允许我实现它。但为什么不好呢?
  • 强制所有结构定义类(实现ICSVFormatDefinition)的方法是否有合适的方法来创建自己的新实例?

提前致谢!

2 个答案:

答案 0 :(得分:4)

  1. 接口声明对象的行为。静态方法不是 对象的方法,它是一个类。所以,班级没有行为, 只是一些实用的方法。
  2. 您可以创建工厂类,或声明非静态工厂方法。我认为,第二种方式对你的情况有好处。如果您的解决方案依赖于createFormatFromFile方法,最好在接口和非静态中声明它。

答案 1 :(得分:1)

Interface的主要目的是定义与对象交互的契约。

静态方法不适用于对象。他们是为了上课。

您可能将createFormatFromFile()放在错误的位置。 关于对象创建,我建议使用Factory / Abstract Factory / Builder设计模式。

链接:http://www.dofactory.com/net/factory-method-design-pattern