2011-04-14 15 views
13
public interface IAutomatizableEvent 
{ 
    Event AutomatizableEventItem { get; } 
    bool CanBeAutomatic { get; } 
    bool IsAutomaticallyRunning { get; } 

    bool OnBeforeAutomaticCall(); 
    bool OnAutomaticCheck(); 
    void OnAutomaticStart(); 
    void OnAutomaticCancel(); 
} 

public abstract class AutomatizableEvent : IAutomatizableEvent 
{ 
    public AutomatizableEvent() 
    { 
    } 

    #region Implementation of IAutomatizableEvent 

    public abstract Event AutomatizableEventItem { get; } 
    public abstract bool CanBeAutomatic { get; } 
    public abstract bool IsAutomaticallyRunning { get; } 
    public abstract bool OnBeforeAutomaticCall(); 
    public abstract bool OnAutomaticCheck(); 
    public abstract void OnAutomaticStart(); 
    public abstract void OnAutomaticCancel(); 

    #endregion 
} 



public static class EventSystem 
{ 
    public static List<EventSystemBase<Event, AutomatizableEvent>> AutomatizableEvents { get; set; } 
    [...] 
} 

में सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर होना चाहिए, है ना?

public abstract class EventSystemBase<T, K> : AutomatizableEvent 
    where T : Event 
    where K : AutomatizableEvent, new() 

मेरा प्रश्न ... नहीं करता 'है "प्रकार' AutomatizableEvent 'है ताकि इसे सामान्य वर्ग में' EventSystemBase 'पैरामीटर' के 'के रूप में उपयोग करने के लिए एक सार्वजनिक parameterless निर्माता होना चाहिए" टी AutomatizableEvent क्या एक सार्वजनिक पैरामीटर रहित कन्स्ट्रक्टर है ??

+1

'नई() 'बाधा को पूरा करने के लिए, आप कक्षा को' = new AutomatizableEvent() 'के साथ प्रारंभ करने में सक्षम होना चाहिए, जिसे आप सार नहीं बना सकते हैं। एक ठोस बाल वर्ग बनाएं और इसके बजाय इसका उपयोग करें। – ja72

उत्तर

31

त्रुटि विवरण गलत है दृष्टांत नहीं कर सकते, लेकिन त्रुटि सही है।

AutomatizableEvent बाधा where K : new() की वजह से सामान्य पैरामीटर K के रूप में उपयोग नहीं किया जा सकता है। एक अमूर्त वर्ग उस बाधा को पूरा नहीं करता है।

एक अमूर्त वर्ग का एक कन्स्ट्रक्टर प्रभावी ढंग से संरक्षित होता है, हमेशा, क्योंकि एक सार को केवल व्युत्पन्न वर्ग के बेस सबोबजेक्ट के रूप में बनाया जा सकता है, इसलिए कन्स्ट्रक्टर को कभी भी व्युत्पन्न वर्ग के निर्माता द्वारा ही बुलाया जा सकता है, और केवल कन्स्ट्रक्टर चेनिंग में। विशेष रूप से new K() संदर्भ में इसका उपयोग EventSystemBase<T, K> द्वारा नहीं किया जा सकता है।

+1

अच्छा जवाब, और अच्छी व्याख्या। +1 – Liz

+0

बहुत अच्छी व्याख्या! +1 –

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

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