簡體   English   中英

如何使用泛型類實現具有接口類型簽名的接口

[英]How to implement interface having a signature of interface type with generic class

我在實現帶有接口的簽名的接口時遇到問題。

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)
    {

    }
}

這給了我編譯時錯誤接口未實現,是否可以完成,我只想實現一個具有不同輸入和輸出類的接口方法。

如果您希望公共方法(隱式)實現接口方法,則它必須具有相同的簽名。 解決這個問題的一種快速而骯臟的方法是提供一個顯式的實現來委派其工作:

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);
    }
}

這里, IReportTInput上是逆變的,在TOutput上是協變的

你可以使用泛型

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

然后將接口實現為

public class ReportBase : IReport<TInput, TOutput>
{
    public TOutput Execute(TInput input)
    {
        // Implementation
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM