2012-01-05 44 views
1

我有一個數學庫的通用接口,這樣的事情:我應該用輸入代碼合同通用接口?

[ContractClass(typeof(MathsDoubleContracts))] 
public interface IMaths<T> 
{ 
    T SomeFunction(T n); 
} 

這使我能夠建立一個IMaths<double>IMaths<decimal>等(雖然起初我只需要double版)。

我想設置代碼合同。目前我已經做到了這一點:

[ContractClassFor(typeof(IMaths<double>))] 
public abstract class MathsDoubleContracts : IMaths<double> 
{ 
    public double SomeFunction(double n) 
    { 
     // Always positive 
     Contract.Ensures(0 <= Contract.Result<double>()); 

     return double.NaN; 
    } 
} 

這似乎是工作,但我很吃驚的是它(因爲我在IMaths<double>而非IMaths<T>指定的合同)。

我在想:

  1. 我可以一個通用的接口上指定多個合同類,每一個特定的類型我想要使用(例如同時擁有[ContractClass(typeof(MathsDoubleContracts))]IMaths<T>[ContractClass(typeof(MathsDecimalContracts))]屬性)?這是明智的做法嗎?
  2. 我會更好而不是使用所有的通用接口(即開始,比如說,所有的功能都定義爲雙打,後面加入IMathsDecimal),比如說IMathsDouble

回答

1

Q1

你可以帶一個例子吧。

編輯

不允許多個。參考here

AttributeUsageAttribute(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] 

注意AllowMultiple = false

Q2

是的,儘管仿製藥可能會帶來一些好處。你的界面並不是通用的。例如,我不能使用IMaths<File>。其實,我回答了一個不同但相關的問題here

您可以添加限制,如where T : ...但也不會做,因爲你要限制爲僅intdouble而你只能做where T : struct這是不一樣的東西。這裏仿製藥僅僅是不能使用的裝飾及IMaths<T>抽象,因爲它是(或者可以嗎?可以取決於你的代碼),你需要具體的類或接口。

子接口是這裏

interface IntMaths : IMaths<int> 
{ 

} 
+0

感謝您的回答。我澄清了我在第一季的含義。 – 2012-01-05 10:16:04

+0

乾杯更新了答案。 – Aliostad 2012-01-05 10:22:20

0

一個安全的選擇,我通過將合同的通用接口類型的這樣做,合同類型,然後在運行時推斷。

我的問題然而被限定在它適用於類型IService的目的然後繼承,對於我需要類型特定實現方式中,「共同編碼」組件的基座的抽象接口。

但是我沒有指定類型的具體執行,我可以簡單地(通過依賴注入)確定合同,並在運行時的對象類型...

Code contract inheritance

我想我的問題是使它「便攜」

相關問題