2017-02-14 12 views
-1

У меня возникла проблема с реализацией интерфейса с сигнатурой, имеющей интерфейс.Как реализовать интерфейс, имеющий подпись типа интерфейса с общим классом

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

    } 
} 

Это дает мне ошибка компиляции времени интерфейс не будет реализован, это может быть сделано или нет, я просто хочу, чтобы реализовать метод интерфейса с различными входными и выходными классами.

+1

сигнатура метода в интерфейсе ожидает объект типа 'IReportInput' но конкретная реализация использует' TInput'. 2 подписи не совпадают, следовательно, ошибка. –

+1

'IReport abc = <некоторый экземпляр ReportBase>; abc.Execute (<некоторая другая реализация IReportInput>); 'см. проблему? –

ответ

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.

+0

Я пробовал этот путь, но когда, наконец, мне нужно отдать свой отчет IReport , он дает мне недопустимое исключение листа. Объявление класса похоже на TestReport: ReportBase Мне нужно отдать TestReport в IReport для вызова report.Execute (input) – kami998

+0

@ kami998, который [работает для меня] (http://pastebin.com/VYDgtjk9) –

0

Вы можете использовать дженерики

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

затем реализуют интерфейс, как

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

Первоначально я использовал общий интерфейс, но когда я передал ReportBase в IReport , он выдал неверное исключение листинга – kami998

+0

@ kami998 посмотрел ответ выше. Это, наверное, лучшее решение. –

 Смежные вопросы

  • Нет связанных вопросов^_^