我想了解界面实现,因为我遇到了一些对我没有意义的错误。 我有这个界面和2个抽象类:
public interface ICashBuddieHelper
{
IHelper FilterOnContext(DbBuddieContext db);
IHelper PrepareResultModel(InputModelBase message);
IHelper SortSet();
ResultModelBase ToResultModel(InputModelBase message);
}
public abstract class ResultModelBase
{
...
}
public abstract class InputModelBase
{
...
}
我有两个实现这个Helper接口的类,但是有更多派生参数的派生版本和返回类型,它们是抽象类,如上所示。 我已经使用以下类实现了IHelper接口
public class BankAccountHelper : ICashBuddieHelper
{
public ICashBuddieHelper FilterOnContext(DbBuddieContext db){...}
public ICashBuddieHelper PrepareResultModel(BankAccountInputModel message){...}//error
public ICashBuddieHelper SortSet(){...}
public ResultModelBase ToResultModel(BankAccountInputModel message){...}//error
}
public class CashFlowHelper : ICashBuddieHelper
{
public ICashBuddieHelper FilterOnContext(DbBuddieContext db){...}
public ICashBuddieHelper PrepareResultModel(CashFlowInputModel message){...}//error
public ICashBuddieHelper SortSet(){...}
public ResultModelBase ToResultModel(CashFlowInputModel message){...}//error
}
从上面的代码片段中,您可以看到实现类中的两行产生了错误:
' CashFlowHelper'没有实现接口成员' ICashBuddieHelper.PrepareResultModel(InputModelBase)' ' CashFlowHelper'没有实现接口成员' ICashBuddieHelper.ToResultModel(InputModelBase)'
有人可以告诉我我做错了什么吗?我想了解我对接口的误解。当然,我可以在抽象类的位置使用更多派生类型。我不明白编译器在抱怨什么。
答案 0 :(得分:1)
当然,我可以使用更多派生类型来代替抽象 类。我不明白编译器在抱怨什么。
接口只包含方法,属性的签名, 事件或索引器。实现接口的类或结构 必须实现接口定义中指定的接口成员。
注意:强调我的
接口是任何派生类必须遵循的契约。
编译器在
之间不做任何假设ICashBuddieHelper PrepareResultModel(InputModelBase message);
和
public ICashBuddieHelper PrepareResultModel(BankAccountInputModel message)
无法BankAccountInputModel
来自InputModelBase
。
就编译器而言,这是两个不同的定义,并且您通过不实现定义的接口来破坏合同。因此编译错误。
然后我可以使用我的派生类型,即BankAccountInputModel?要么 而是如何在界面中使用基本类型并使用a 该类型的更多衍生版本?
您可以考虑的一种可能性是使用Generics (C# Programming Guide),这本身就是一个完整的其他主题,但请看以下示例重构接口并使用您之前定义的类型。
public interface ICashBuddieHelper<T> where T : InputModelBase {
ICashBuddieHelper<T> FilterOnContext(DbBuddieContext db);
ICashBuddieHelper<T> PrepareResultModel(T message);
ICashBuddieHelper<T> SortSet();
ResultModelBase ToResultModel(T message);
}
public class BankAccountInputModel : InputModelBase {
//...
}
public class BankAccountHelper : ICashBuddieHelper<BankAccountInputModel> {
public ICashBuddieHelper<BankAccountInputModel> FilterOnContext(DbBuddieContext db) { return null; }
public ICashBuddieHelper<BankAccountInputModel> PrepareResultModel(BankAccountInputModel message) {
return null;
}
public ICashBuddieHelper<BankAccountInputModel> SortSet() { return null; }
public ResultModelBase ToResultModel(BankAccountInputModel message) {
return null;
}
}
每一项都会增加所需的复杂性。
我建议您检查一下您的设计选择。
答案 1 :(得分:0)
您的类不是从接口派生的,而是为每个类添加:IHelper,如:
public class BankAccountHelper : IHelper