2010-08-14 49 views
3

考慮下面的代碼示例時:特定類型的實現類使用的接口

interface IData { 
    int Count(); 
} 

interface IOperations { 
    IData Foo(); 
    double Bar(IData a); 
} 

class Data1 : IData { 
    public int Count() { return 37; } 
    public double SomethingElse { get; set; } 
} 

class Ops1 : IOperations 
{ 
    public Data1 Foo() { return new Data1(); } // want to return specific type here 
    public double Bar(Data1 x) { ... } // want to get specific type here 
            // and not use operator as everywhere 
} 

// more definitions of classes Data2, Ops2, Data3, Ops3, ... 

// some code: 
Ops1 a = new Ops1(); 
Data1 data = a.Foo(); // want Data1 here not IData! 
double x = a.Bar(data); 

我當然可以只使用public IData Foo() { return new Data1(); }

// some code 
Ops1 a = new Ops1(); 
Data1 data = a.Foo() as Data1; 

as無處不在,代碼正迅速成爲混亂。

我不知道是否有一個良好的設計模式,以清晰和強大的方式實現這一目標?

編輯:是很重要,是行動和數據共享一個公共基類:

List<IOperations> ops = ...; 
List<IData> data = ...; 
List<double> result = ...; 
for(int i=0; i<ops.Count; i++) 
    result[i] = ops[i].Bar(data[i]); 

因此,對於具有返回類型的情況下,我不知道,這是被禁止的,因爲我滿足要求的界面。在參數情況下,可能需要一些額外的(模板)層。

+0

的C#什麼版本/ .NET您使用的? – 2010-08-14 14:34:37

回答

5

你可以使用泛型:

interface IOperations<T> where T: IData 
{ 
    T Foo(); 
    double Bar(T a); 
} 

class Ops1 : IOperations<Data1> 
{ 
    public Data1 Foo() { return new Data1(); } 
    public double Bar(Data1 x) { /* ... */ } 
} 
+0

..重要的是,類Ops1:IOperations {} – Ani 2010-08-14 14:35:08

+0

謝謝,補充說! – 2010-08-14 14:35:49

+0

但是現在Ops和Data沒有共同的基類。我在這個問題上加了這個。 – Danvil 2010-08-14 15:21:11

相關問題