接口中的C#构造函数

时间:2009-11-06 08:17:11

标签: c# interface generics

我知道你不能在界面中有一个构造函数,但这就是我想要做的:

 interface ISomething 
 {
       void FillWithDataRow(DataRow)
 }


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

我真的想以某种方式用构造函数替换ISomething的{​​{1}}方法。

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

有没有人会有我想要的模式?

2 个答案:

答案 0 :(得分:6)

使用抽象类代替?

如果你想要,你也可以让你的抽象类实现一个接口......

interface IFillable<T> {
    void FillWith(T);
}

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

    protected void FillWith(DataRow row);
}

答案 1 :(得分:3)

(我应该先检查一下,但我很累 - 这主要是duplicate。)

要么有工厂界面,要么将Func<DataRow, T>传递给构造函数。 (它们大部分是等价的,真的。接口可能更适合依赖注入,而委托则不那么繁琐。)

例如:

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));