如何实现具有泛型类的接口类型签名的接口

时间:2017-02-14 14:51:09

标签: c# generics interface

我在实现具有接口签名的接口时遇到问题。

public interface IReport
{
    IReportOutput Execute(IReportInput input); 
}

public class ReportBase<TInput, TOutput> : IReport where TInput : IReportInput, new() where TOutput : IReportOutput, new()
{

    public TOutput Execute(TInput input)
    {

    }
}

这给了我编译时错误,接口未实现,是否可以完成,我只是想实现一个具有不同输入和输出类的接口方法。

2 个答案:

答案 0 :(得分:0)

如果希望公共方法(隐式)实现接口方法,则它必须具有相同的签名。解决这个问题的一种快速而肮脏的方法是提供一个委托其工作的显式实现:

IReportOutput IReport.Execute(IReportInput input) => Execute((TInput)input);

请注意演员:您的ReportBase课程可以投放到IReport,并与 类型为TInput的参数一起使用 - 您将如果您尝试这样做,则会收到无效的强制转换异常。

更安全的方法是使用差异:

public interface IReport<in TInput, out TOutput>
    where TInput : IReportInput
    where TOutput : IReportOutput
{
    TOutput Execute(TInput input);
}

public class ReportBase<TInput, TOutput> : IReport<TInput, TOutput>
    where TInput : IReportInput, new()
    where TOutput : IReportOutput, new()
{
    public TOutput Execute(TInput input)
    {
        return default(TOutput);
    }
}

此处IReport上的TInput 逆变 TOutput上的协变

答案 1 :(得分:0)

您可以使用泛型

addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.7")
addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.13")

然后将接口实现为

public interface IReport<InputType, OutputType>
{
    OutputType Excecute(InputType input);
}