2013-10-10 71 views
1

喜IAM試圖把我的代碼合同接口上我的課,我寫的是這樣的:代號合約在接口財產

[ContractClass(typeof(MyClassContract))] 
interface IMyClass 
{ 
    int Id { get; set; } 
} 

[ContractClassFor(typeof(IMyClass))] 
sealed class MyClassContract : IMyClass 
{ 
    public int Id 
    { 
     get { return Id; } 
     set { Contract.Requires(value > 0); } 
    } 
} 

public class MyClass : IMyClass 
{ 
    private int _id; 
    public int Id 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

} 

但不喜歡被強迫定義合約一個get將要沒用過,說我可以寫爲

get { return "abcdrdkldbfldsk"; } 

,不喜歡被強迫使用公共財產的一個內部類,只是因爲寫斜面

get { return ImyClass.Id; } 

編輯: 這是我想什麼就寫:

[ContractClassFor(typeof(IMyClass))] 
sealed class MyClassContract : IMyClass 
{ 
    int IMyClass.Id 
    { 
     set { Contract.Requires(value > 0); } 
    } 
} 
+0

如果get永遠不會被使用,爲什麼不直接聲明'int Id {set; }'在接口中,而不是在'MyClassContract'和'MyClass'中實現? – luiscubal

+0

好吧,如果你打算公開一個get屬性,並且要求ID不能小於或等於0,那麼你也需要對getter執行這個要求。接口不強制實現,因此,具體類可能會非常好地使用除setter之外的其他方法來設置Id屬性的基礎值。 – Polity

+0

get將用於MyClass,MyClassContract中的get從未使用 –

回答

2

如果您在ContractClassForMyClassContract)添加合同不變:

[ContractInvariantMethod] 
private void ObjectInvariant() 
{ 
    Contract.Invariant (Id >= 0); 
} 

然後一個Ensures/Requires對會添加到該屬性的get/sets。 (參考2.3.1 of the reference

然後,您可以在ContractClassFor

int Id { get; set; } 

使用自動屬性(即仍然需要因爲接口的添加屬性,)

更多here

+0

好的,是東西,但不能寫Contract.Invariant(MyClass.Id> = 0),所以我必須把它寫成公共變量;並沒有辦法指定一個異常類型 –