使用抽象类输入参数的接口实现

时间:2017-12-27 06:53:32

标签: c#

我想了解界面实现,因为我遇到了一些对我没有意义的错误。 我有这个界面和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)'

有人可以告诉我我做错了什么吗?我想了解我对接口的误解。当然,我可以在抽象类的位置使用更多派生类型。我不明白编译器在抱怨什么。

2 个答案:

答案 0 :(得分:1)

  

当然,我可以使用更多派生类型来代替抽象   类。我不明白编译器在抱怨什么。

引用interface (C# Reference)

  

接口只包含方法,属性的签名,   事件或索引器。实现接口的类或结构   必须实现接口定义中指定的接口成员

注意:强调我的

接口是任何派生类必须遵循的契约。

编译器在

之间不做任何假设
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