2017-09-14 11 views
5

強く型付けされたコマンドとそのコマンド自体の入出力パラメータを持つコマンドパターンを実装しようとしています。コマンドパターンにタイプエラーがあります

Iは、コマンドの入力と出力マーク二つのインタフェース作成したすべての最初の:私は基本クラスとインタフェースを作成した

interface IRequest { } 
interface IResponse { } 

を。これは私がこれらのオブジェクトを使用しようとしていますので、私は私が最終的に必要な具体的なクラス

class TypeARequest : IRequest 
{ 
    public TypeARequest() { 
    } 

    public int NumericValueA { get; set; } 
    public int NumericValueB { get; set; } 
} 

class TypeAResponse : IResponse 
{ 
    public TypeAResponse() { 
    } 

    public int Result { get; set; } 
} 

class SumCommand : AbstractCommand<TypeARequest, TypeAResponse> 
{ 
    public SumCommand(IReceiver<TypeARequest, TypeAResponse> receiver) : base(receiver) { 
    } 

    public override TypeAResponse Execute(TypeARequest request) { 
     return _receiver.Action(request); 
    } 
} 

class SumReceiver : IReceiver<TypeARequest, TypeAResponse> 
{ 
    public TypeAResponse Action(TypeARequest request) { 
     return new TypeAResponse() { Result = request.NumericValueA + request.NumericValueB }; 
    } 

} 

を作成している今

abstract class AbstractCommand<TRequest, TResponse> 
    where TRequest : IRequest 
    where TResponse : IResponse 
{ 
    protected IReceiver<TRequest, TResponse> _receiver; 

    public AbstractCommand(IReceiver<TRequest, TResponse> receiver) { 
     _receiver = receiver; 
    } 

    public abstract TResponse Execute(TRequest request); 
} 

抽象受信機

interface IReceiver<TRequest, TResponse> 
    where TRequest : IRequest 
    where TResponse : IResponse 
{ 
    TResponse Action(TRequest request); 
} 

この抽象コマンドですCommandProcessorクラスを作成しました。複数のコマンドを一度に処理できるようにする必要があります。

class CommandProcessor 
{ 
    IList<AbstractCommand<IRequest, IResponse>> _supportedCommands = new List<AbstractCommand<IRequest, IResponse>>(); 

    public CommandProcessor() { 
    } 

    void AddSupportedCommand(AbstractCommand<IRequest, IResponse> item) { 
     _supportedCommands.Add(item); 
    } 

    void SetupSupportedCommands() { 
     // ERROR HERE 
     AddSupportedCommand(new SumCommand(new SumReceiver())); 
    } 

} 

しかし、私はコンパイル時にエラーが言って取得しています:

引数1: に 'SumCommand' から変換することはできません 'をAbstractCommand'

任意のヘルプや提案?

+2

私はこれがあなたのキャッチだと思い

interface IRequest { } interface IResponse { } interface IReceiver<in TRequest, out TResponse> where TRequest : IRequest where TResponse : IResponse { TResponse Action(TRequest request); } interface ICommand<out TRequest, out TResponse> { } abstract class AbstractCommand<TRequest, TResponse> : ICommand<TRequest, TResponse> where TRequest : IRequest where TResponse : IResponse { protected IReceiver<TRequest, TResponse> _receiver; public AbstractCommand(IReceiver<TRequest, TResponse> receiver) { _receiver = receiver; } public abstract TResponse Execute(TRequest request); } class CommandProcessor { IList<ICommand<IRequest, IResponse>> _supportedCommands = new List<ICommand<IRequest, IResponse>>(); public CommandProcessor() { } void AddSupportedCommand(ICommand<IRequest, IResponse> item) { _supportedCommands.Add(item); } void SetupSupportedCommands() { AddSupportedCommand(new SumCommand(new SumReceiver())); } } 

詳細情報:https://docs.microsoft.com/en -us/dotnet/csharp/programming-guide/concepts/covariance-contravariance/indexとこれもhttps://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/covariance-contravariance/にあります。 Creating-variant-generic-interfaces – Fildor

答えて

2

あなたがインターフェイスを作成し、共分散の例として、あなたの一般的なパラメータをマークする必要があります。ここにout modifier msdn

+0

ありがとうございました。実際にあなたの解決策は、 '無効な分散モディファイア。バリアントとして指定できるのは、インターフェースおよびデリゲート・タイプのパラメーターだけです。 \t 'しかし、それは' ICommand'インターフェースを作成することで解決できるようです... – Lorenzo

+0

はい、私はそのエラーに走っていました、私はそれを修正し、私のソリューションを更新しています。申し訳ありません私の意図ではなかった – Alcruz

+0

私は理解しています。しかし、編集後、私はまだエラーが発生しています。まず、IRequestに「out」を追加することはできません。以前と同じエラーが表示されます。あなたがコンソールプログラムに自分のコードを入れたら、同じエラーが出るはずです – Lorenzo