2017-09-14 13 views
5

Tôi đang cố triển khai mẫu lệnh có thông số đầu vào và đầu ra được nhập mạnh mẽ cho chính lệnh đó.Lỗi loại trong mẫu lệnh

Trước hết tôi đã tạo ra hai giao diện đánh dấu đầu vào và đầu ra cho các lệnh:

interface IRequest { } 
interface IResponse { } 

Sau đó, tôi đã tạo ra các lớp cơ sở và giao diện. Đây là nhận trừu tượng

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

và điều này lệnh trừu tượng

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

Bây giờ tôi đang cố gắng sử dụng các đối tượng này và vì vậy tôi đã tạo ra các lớp bê tông cần

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

} 

Cuối cùng tôi đã tạo một lớp CommandProcessor sẽ có thể xử lý nhiều lệnh hoàn toàn

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

} 

Tuy nhiên tôi nhận được một lỗi thời gian biên dịch nói:

Đối số 1: không thể chuyển đổi từ 'SumCommand' để 'AbstractCommand'

Bất kỳ sự giúp đỡ hoặc gợi ý?

+2

Tôi đoán đây là bắt bạn: https://docs.microsoft.com/en -us/dotnet/csharp/lập trình-hướng dẫn/khái niệm/hiệp phương sai-contravariance/index và điều này cũng: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/covariance-contravariance/ tạo-biến-chung-giao diện – Fildor

Trả lời

2

Bạn nên tạo một giao diện và đánh dấu tham số chung của bạn như là hiệp phương sai Ví dụ:

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

} 

biết thêm thông tin ở đây out modifier msdn

+0

Cảm ơn. Trên thực tế, giải pháp của bạn kết thúc bằng một lỗi nói rằng 'Công cụ sửa đổi phương sai không hợp lệ. Chỉ có thể chỉ định các tham số kiểu giao diện và ủy nhiệm làm biến thể. \t 'Tuy nhiên, có vẻ như có thể giải quyết bằng cách tạo giao diện' ICommand' ... – Lorenzo

+0

Có, tôi đã chạy đến lỗi đó, tôi sửa lỗi và cập nhật giải pháp của mình. xin lỗi không phải ý định của tôi – Alcruz

+0

Đừng lo lắng tôi hiểu. Tuy nhiên sau khi theo dõi chỉnh sửa của bạn, tôi vẫn nhận được lỗi: đầu tiên tôi không thể thêm "ra" để IRequest, sau đó tôi cũng nhận được lỗi tương tự như trước. Nếu bạn đặt mã của tôi trong một chương trình điều khiển, bạn sẽ nhận được cùng một lỗi – Lorenzo

Các vấn đề liên quan