2017-08-02 6 views
9

लौटाएं मेरे पास एक बेस क्लास है और इससे प्राप्त कुछ वर्ग हैं।सी # अमूर्त विधि कैसे लिखें जो enum

मैं आधार वर्ग में एक enum को सार के रूप में घोषित करना चाहता हूं और इससे प्राप्त प्रत्येक वर्ग को अपना स्वयं का अलग-अलग enum बनाना होगा।

मैं यह कैसे कर सकता हूं? आधार वर्ग कि वापसी enum प्रकार में एक सार विधि और प्रत्येक वर्ग कि लागू यह अपने आप ही enum वापस आ जाएगी की घोषणा:

public abstract enum RunAtOptions(); 

लेकिन मैं संकलन त्रुटि

"The modifier abstract is not valid for this item" 
मिल

मैं निम्नलिखित की कोशिश की

+0

एक enum एक प्रकार है और आप सार प्रकार नहीं हो सकता ... –

+4

इस अनुकरण करने के लिए तरीके हैं, लेकिन मैं तुम नहीं संदेह वास्तव में इसकी आवश्यकता है, यह एक [एक्सवाई समस्या] (http://xyproblem.info/) जैसा दिखता है। –

+0

आपका मतलब है कि आप व्युत्पन्न कक्षा के आधार पर कौन सा enum वापस आना है बदलना चाहते हैं? तो, जेनेरिक? – DavidG

उत्तर

5

आप वास्तविक enum नहीं लौटने के लिए enum कीवर्ड की जरूरत है, इसलिए यदि आप enumMyEnumType इस तरह था:

public enum MyEnumType 
{ 
    ValueOne = 0, 
    ValueTwo = 1 
} 

public abstract MyEnumType RunAtOptions(); 

आप जेनरिक उपयोग करने के लिए इस संशोधित करने के लिए करना चाहता था, तो आप विधि वापसी T है और T एक struct बनाने के लिए एक बाधा हो सकता है:

public abstract T RunAtOptions() where T : struct; 

सी # एक जेनरिक बाधा enum समर्थन करने के लिए नहीं है प्रकार।

+0

उत्तर में सुझाए गए जेनेरिक का उपयोग कर सकते हैं, लेकिन 'MyEnumType' हल करने की समस्या है। –

+1

enum परिभाषा दिखाने के लिए उत्तर संपादित किया गया। –

+2

_ "और इससे प्राप्त प्रत्येक वर्ग को अपना स्वयं का अलग-अलग enum" _ –

1

आप enum कीवर्ड को अमूर्त सदस्य के रूप में उपयोग नहीं कर सकते हैं।Similar question

वैकल्पिक रूप से, आप एक सार शब्दकोश शब्दकोश पेश कर सकते हैं।

public class Base 
{ 
    public abstract Dictionary<string, int> RunAtOptions { get; } 
} 

व्युत्पन्न वर्ग कन्स्ट्रक्टर में संपत्ति सेट कर सकता है।

public class Derived : Base 
{ 
    public override Dictionary<string, int> RunAtOptions { get; } 

    public Derived() 
    { 
     RunAtOptions = new Dictionary<string, int> 
     { 
      ["Option1"] = 1, 
      ["Option2"] = 2 
     } 
    } 
} 

दुर्भाग्य से इस विधि का उपयोग करने से आपको सुरुचिपूर्ण संकलन-समय की जांच नहीं मिल जाएगी। इस शब्दकोश के साथ आप इस तरह शब्दकोश में प्रविष्टियों के खिलाफ विकल्प मूल्यों की तुलना कर सकते हैं:

if (someObject.Options == RunAtOptions["Option1"]) // someObject.Options is of type `int` 
{ 
    // Do something 
} 
संबंधित मुद्दे