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 ý?
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