2009-11-06 40 views
5

Tôi biết rằng bạn không thể có một constructor trong một giao diện, nhưng đây là những gì tôi muốn làm:C# constructor trong giao diện

interface ISomething 
{ 
     void FillWithDataRow(DataRow) 
} 


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

Tôi thực sự muốn thay thế ISomething 's FillWithDataRow phương pháp với một constructor bằng cách nào đó.

Bằng cách đó, lớp thành viên của tôi có thể triển khai giao diện và vẫn đọc được (không thể với phương thức FillWithDataRow).

Có ai có mẫu sẽ làm những gì tôi muốn không?

+0

lớp thành viên Những gì bạn muốn trở thành readonly? –

+0

trùng lặp - xem tại đây http://stackoverflow.com/questions/619856/interface-defining-a-constructor-signature – Blounty

+0

Bản sao có thể có của [Giao diện xác định chữ ký hàm tạo?] (Https://stackoverflow.com/questions/619856/interface-define-a-constructor-signature) – Nisarg

Trả lời

3

(tôi nên đã kiểm tra đầu tiên, nhưng tôi mệt mỏi -. Đây là chủ yếu là một duplicate)

Hoặc có giao diện nhà máy hoặc chuyển một số Func<DataRow, T> vào hàm tạo của bạn. (Họ chủ yếu là tương đương, thực sự Giao diện có lẽ là tốt hơn cho Dependency Injection trong khi các đại biểu là ít kén chọn..)

Ví dụ:

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

sử dụng lớp trừu tượng thay thế?

bạn cũng có thể có lớp trừu tượng của bạn thực hiện một giao diện nếu bạn muốn ...

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

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

    protected void FillWith(DataRow row); 
}