Странные предупреждения / ошибки с контрактами кода и наследованием интерфейса - PullRequest
2 голосов
/ 09 сентября 2011

как тема темы, я столкнулся с ужасными предупреждениями / ошибками с контрактами кода и интерфейсом.Вот мой сценарий

Первичный интерфейс

[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.

Но, если я попытаюсь удалить метод и свойства IDTOInfo в классах контрактов IDTONews и IDTOPromo, ошибки будут, например, следующие

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

Странная ситуация, не правда ли?Есть ли решение, позволяющее наилучшим образом сочетать кодовые контракты и интерфейс с предыдущим сценарием?

Спасибо!

1 Ответ

1 голос
/ 19 сентября 2011

Классы контракта должны указывать поведение только для интерфейса, к которому они присоединены, а не для любых базовых интерфейсов.

Таким образом, в DTOPromoContract и DTONewsContract все методы, которые наследуются от IDTOInfo должно быть abstract.(Все классы контрактов интерфейса также должны быть abstract.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...