2017-09-14 3 views
5

में त्रुटि टाइप करें मैं आदेश के लिए दृढ़ता से टाइप किए गए इनपुट और आउटपुट पैरामीटर के साथ एक कमांड पैटर्न को कार्यान्वित करने का प्रयास कर रहा हूं।कमांड पैटर्न

सब मैं दो इंटरफेस है कि इनपुट और आदेश के लिए उत्पादन के निशान बनाया है सबसे पहले:

interface IRequest { } 
interface IResponse { } 

तो मैं बना लिया है आधार वर्ग और इंटरफेस। यह सार रिसीवर

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

और इस सार आदेश

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

अब मैं इन वस्तुओं का उपयोग करने की कोशिश कर रहा हूँ और इसलिए मैं जरूरत ठोस वर्गों

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

} 

मैं बनाया है अंत में है एक कमांडप्रोसेसर क्लास बनाया है जो एकाधिक कमांड को पूरी तरह से संसाधित करने में सक्षम होना चाहिए

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

मुझे लगता है कि यह आपकी कमी है: https://docs.microsoft.com/en -us/dotnet/csharp/प्रोग्रामिंग-गाइड/अवधारणाओं/covariance-contravariance/अनुक्रमणिका और यह भी: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/covariance-contravariance/ बनाने-संस्करण-जेनेरिक-इंटरफेस – 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

धन्यवाद। असल में आपका समाधान एक त्रुटि के साथ समाप्त होता है जिसमें 'अमान्य भिन्नता संशोधक' कहा जाता है। केवल इंटरफ़ेस और प्रतिनिधि प्रकार पैरामीटर को संस्करण के रूप में निर्दिष्ट किया जा सकता है। \t 'हालांकि ऐसा लगता है कि 'आईसीओएमएंड' इंटरफ़ेस बनाकर हल किया जा सकता है ... – Lorenzo

+0

हां, मैं उस त्रुटि पर चल रहा था, मैं इसे ठीक कर रहा हूं और अपना समाधान अपडेट कर रहा हूं। क्षमा करें मेरा इरादा नहीं था – Alcruz

+0

कोई चिंता नहीं मैं समझता हूं। हालांकि, आपके संपादन का पालन करने के बाद, मुझे अभी भी त्रुटियां मिल रही हैं: पहले मैं आईआरक्वेट में "आउट" नहीं जोड़ सकता, फिर मुझे पहले की तरह ही त्रुटि मिलती है। यदि आप मेरा कोड कंसोल प्रोग्राम में डालते हैं तो आपको एक ही त्रुटि मिलनी चाहिए – Lorenzo

संबंधित मुद्दे