2009-11-06 22 views
5

wiem, że nie można mieć konstruktora w interfejsie, ale tutaj jest to, co chcę zrobić:C# Konstruktor w interfejsie

interface ISomething 
{ 
     void FillWithDataRow(DataRow) 
} 


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

naprawdę chciałbym wymienić ISomething „s FillWithDataRow metodę z konstruktor jakoś.

W ten sposób moja klasa członków może zaimplementować interfejs i nadal być tylko do odczytu (nie można go zastosować w metodzie FillWithDataRow).

Czy ktoś ma wzór, który zrobi to, co chcę?

+0

Co klasa członek chcesz być tylko do odczytu? –

+0

duplikat - zajrzyj tutaj http://stackoverflow.com/questions/619856/interface-definicje-a-constructor-signature – Blounty

+0

Możliwy duplikat [Interface definiujący sygnaturę konstruktora?] (Https://stackoverflow.com/questions/619856/interface-definiujący-a-konstruktor-podpis) – Nisarg

Odpowiedz

3

(Powinienem był sprawdzany pierwszy, ale jestem zmęczony. - jest to głównie duplicate)

Należy mieć interfejs fabryczny lub przekazać do konstruktora Func<DataRow, T>. (Są przeważnie odpowiednik, naprawdę Interfejs jest prawdopodobnie lepsza dla Dependency Injection natomiast delegatem jest mniej wybredny.).

Na przykład:

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

zamiast tego użyć klas abstrakcyjnych?

można również mieć swój abstrakcyjny klasy implementują interfejs, jeśli chcesz ...

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

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

    protected void FillWith(DataRow row); 
}