作为主题主题,我遇到过带有代码约定和接口的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'
这是一个奇怪的情况,不是吗? 是否有解决方案可以将代码约定和接口与上一个场景进行最佳组合?
谢谢!
答案 0 :(得分:1)
合同类应该只指定它们所附加的接口的行为,而不是任何基接口。
因此,在DTOPromoContract
和DTONewsContract
中,从IDTOInfo
继承的所有方法都应为abstract
。 (所有接口合同类也应该是abstract
。)