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

本文关键字:方案 方法 静态 接口 | 更新日期: 2023-09-27 18:02:10

我有以下情况:我想通过它们的结构来识别CSV文件。结构可以简单地表示"列名",但是可以想象更复杂的结构定义,包括CSV文件的更多属性。例如"列名和分隔符"或"文件名满足模式"等等。

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

interface ICSVFormatDefinition {
    bool isFileInThisFormat(string filename);
}

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

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

本例中的createFormatFromFile方法在接口的每个实现中当然是不同的,因为一个只查看文件名,而另一个可能查看列名等等。

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

我的问题是:

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

提前感谢!

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

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

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

静态方法不适合对象。它们是用来上课的

你可能把createFormatFromFile()放在了错误的地方。关于对象创建,我建议使用工厂/抽象工厂/生成器设计模式。

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