2017-09-14 2 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 : 'AbstractCommand'

어떤 도움이나 제안 에 'SumCommand'에서 변환 할 수 없습니다?

+2

나는 이것이 당신의 캐치 추측 : https://docs.microsoft.com/en를 -us/dotnet/csharp/programming-guide/concepts/공분산 - 반 환율/색인 및 기타 : https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/covariance-contravariance/ Creating-variant-generic-interfaces – Fildor

답변

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

} 
여기

더 많은 정보 out modifier msdn

+0

고마워요. 실제로 해결책은'잘못된 분산 수정 자 '라는 오류로 끝납니다. variant로 인터페이스 및 대리자 형식 매개 변수 만 지정할 수 있습니다. \t'그러나 그것은 'ICommand' 인터페이스를 생성하여 해결할 수있는 것 같습니다 ... – Lorenzo

+0

예, 나는 그 오류를 실행하고 있었고, 수정하고 솔루션을 업데이트했습니다. 미안하지만 내 의도가 아니었다 – Alcruz

+0

나는 이해하고 걱정하지 않는다. 그러나 편집 한 후에도 여전히 오류가 발생합니다. 먼저 IRequest에 "out"을 추가 할 수 없으며 이전과 같은 오류가 발생합니다. 콘솔 코드에 코드를 삽입하면 동일한 오류가 발생합니다. – Lorenzo

관련 문제