我在实现具有接口签名的接口时遇到问题。
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)
{
}
}
这给了我编译时错误,接口未实现,是否可以完成,我只是想实现一个具有不同输入和输出类的接口方法。
答案 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);
}