代码约定和接口继承的奇怪警告/错误

时间:2011-09-09 10:29:27

标签: inheritance c#-4.0 interface code-contracts

作为主题主题,我遇到过带有代码约定和接口的strage Warnings / Erros。 这是我的方案

主要界面

[ContractClass(typeof(DTOInfoContract))]
public interface IDTOInfo
{
    int ID { get; }
    string Description { get; }        
    string LinkText { get; }
    string Title { get; }

    void DTOInit(int id, string title, string descr, string linkText);
}

辅助接口

[ContractClass(typeof(DTONewsContract))]
public interface IDTONews : IDTOInfo
{    
}

[ContractClass(typeof(DTOPromoContract))]
public interface IDTOPromo : IDTOInfo
{                
    string Photo { get; }

    void DTOPromoInit(int id, string title, string descr, string linkText, string Photo);

然后我的合同

[ContractClassFor(typeof(IDTOInfo))]
public abstract class DTOInfoContract : IDTOInfo
{
    int IDTOInfo.ID
    {
        get { Contract.Ensures(Contract.Result<int>() > 0, "Returned value is out of Range"); return default(int); }
    }

    string IDTOInfo.Description
    {
        get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
    }

    string IDTOInfo.LinkText
    {
        get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
    }

    string IDTOInfo.Title
    {
        get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
    }

    void IDTOInfo.DTOInit(int id, string title, string descr, string linkText)
    {
        Contract.Requires<ArgumentOutOfRangeException>(id > 0, "id has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(title), "titolo has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(descr), "descr has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(linkText), "linkText has no valid value");
    }
}


}


[ContractClassFor(typeof(IDTONews))]
public abstract class DTONewsContract : IDTONews
{
    int IDTOInfo.ID
    {
        get { Contract.Ensures(Contract.Result<int>() > 0, "Returned value is out of Range"); return default(int); }
    }

    string IDTOInfo.Description
    {
        get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
    }

    string IDTOInfo.linkText
    {
        get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
    }

    string IDTOInfo.Title
    {
        get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
    }

    void IDTOInfo.DTOInit(int id, string title, string descr, string linkText)
    {
        Contract.Requires<ArgumentOutOfRangeException>(id > 0, "id has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(title), "title has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(descr), "descr has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(linkText), "linkText has no valid value");
    }
}


[ContractClassFor(typeof(IDTOPromo))]
public abstract class DTOPromoContract : IDTOPromo
{        
    string IDTOPromo.Photo
    {
        get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
    }        

    void IDTOPromo.DTOPromoInit(int id, string title, string descr, string linkText, string photo)
    {
        Contract.Requires<ArgumentOutOfRangeException>(id > 0, "id has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(title), "title has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(descr), "descr has no valid value");                  
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(linkText), "linkText has no valid value");
    }

    int IDTOInfo.ID
    {
        get { Contract.Ensures(Contract.Result<int>() > 0, "Returned value is out of Range"); return default(int); }
    }

    string IDTOInfo.Description
    {
        get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
    }

    string IDTOInfo.LinkText
    {
        get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
    }

    string IDTOInfo.Title
    {
        get { Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()), "Returned value is out of Range"); return default(string); }
    }

    void IDTOInfo.DTOInit(int id, string title, string descr, string linkText)
    {
        Contract.Requires<ArgumentOutOfRangeException>(id > 0, "id has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(title), "title has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(descr), "descr has no valid value");
        Contract.Requires<ArgumentOutOfRangeException>(!String.IsNullOrEmpty(linkText), "linkText has no valid value");
    }
}

在这种情况下,我只有一些警告,如下面的

warning CC1076: Contract class DTOPromoContract cannot define contract for method IDTOInfo.get_ID as its original definition is not in type IDTOPromo. Define the contract on type IDTOInfo instead.

但是,如果我尝试删除IDTONews和IDTOPromo合同类中的IDTOInfo方法和属性,则错误例如是以下

Error   40 'DTOPromoContract' does not implement the member of interface 'IDTOInfo.Description' 

这是一个奇怪的情况,不是吗? 是否有解决方案可以将代码约定和接口与上一个场景进行最佳组合?

谢谢!

1 个答案:

答案 0 :(得分:1)

合同类应该只指定它们所附加的接口的行为,而不是任何基接口。

因此,在DTOPromoContractDTONewsContract中,从IDTOInfo继承的所有方法都应为abstract。 (所有接口合同类也应该是abstract。)