2009-11-06 15 views
5

Ich weiß, dass Sie nicht einen Konstruktor in einer Schnittstelle haben, aber hier ist es, was ich tun möchte:C# Konstruktor in Schnittstelle

interface ISomething 
{ 
     void FillWithDataRow(DataRow) 
} 


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

Ich würde wirklich gerne ISomething ‚s FillWithDataRow Methode mit einem ersetzen Konstruktor irgendwie.

Auf diese Weise konnte meine Member-Klasse die Schnittstelle implementieren und immer noch readonly (es kann nicht mit der FillWithDataRow-Methode).

Hat jemand ein Muster, das tun wird, was ich will?

+0

Welches Mitglied Klasse, die Sie nur lesbar sein? –

+0

duplizieren - hier klicken http://stackoverflow.com/questions/619856/interface-defining-a-constructor-signature – Blounty

+0

Mögliches Duplikat von [Interface definiert eine Konstruktorsignatur?] (Https://stackoverflow.com/questions/619856/Interface-defining-a-Konstruktor-Signatur) – Nisarg

Antwort

3

(ich sollte zuerst überprüft haben, aber ich bin müde -. Dies ist vor allem ein duplicate)

Sie haben entweder eine Factory-Schnittstelle oder geben eine Func<DataRow, T> in Ihren Konstruktor ein. (Sie sind meist gleichwertig, wirklich Die Schnittstelle ist wahrscheinlich besser für Dependency Injection, während die Delegierten weniger pingelig sind..)

Zum Beispiel:

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

Verwenden Sie stattdessen eine abstrakte Klasse?

Sie können auch Ihre abstrakte Klasse eine Schnittstelle implementieren, wenn Sie wollen ...

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

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

    protected void FillWith(DataRow row); 
}