接口中的C#构造函数

C# constructor in interface

我知道在接口中不能有构造函数,但我想做的是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 interface ISomething
 {
       void FillWithDataRow(DataRow)
 }


 class FooClass<T> where T : ISomething , new()
 {
      void BarMethod(DataRow row)
      {
           T t = new T()
           t.FillWithDataRow(row);
      }
  }

我真的想用一个构造函数来替换ISomethingFillWithDataRow方法。

这样,我的成员类可以实现接口,并且仍然是只读的(它不能与FillWithDataRow方法一起使用)。

有没有人有一个模式可以做我想要的?


使用抽象类?

如果需要,还可以让抽象类实现接口…

1
2
3
4
5
6
7
8
9
10
11
interface IFillable<T> {
    void FillWith(T);
}

abstract class FooClass : IFillable<DataRow> {
    public void FooClass(DataRow row){
        FillWith(row);
    }

    protected void FillWith(DataRow row);
}

(我应该先检查一下,但我累了——这大多是副本。)

要么有一个工厂接口,要么将一个Func传递到构造函数中。(实际上,它们基本上是等效的。接口可能更适合依赖项注入,而委托则不那么麻烦。)

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
interface ISomething
{      
    // Normal stuff - I assume you still need the interface
}

class Something : ISomething
{
    internal Something(DataRow row)
    {
       // ...
    }        
}

class FooClass<T> where T : ISomething , new()
{
    private readonly Func<DataRow, T> factory;

    internal FooClass(Func<DataRow, T> factory)
    {
        this.factory = factory;
    }

     void BarMethod(DataRow row)
     {
          T t = factory(row);
     }
 }

 ...

 FooClass<Something> x = new FooClass<Something>(row => new Something(row));