2011-09-16 22 views
37

अगर ऐसा है तो मुझे कुछ प्रकार का बिंदु याद आ सकता है - कृपया मेरे प्रश्न के एक हिस्से के रूप में उस चर्चा को शामिल करें :)।कार्यक्षमता के लिए विधियों के साथ Enum (संयोजन कक्षा/एनम)

यह एक संक्षिप्त कोड है और एक कार्य कोड का नमूना नाम दिया गया है। GetTicks (..) एक नमूना है, जो कि किसी भी तरह की कार्यक्षमता हो सकता है (> 0 < 9 का मान एक विशिष्ट Enum a.so वापस करना चाहिए)।

public static class Something 
{ 
    public enum TypeOf : short 
    { 
     Minute = 2, Hour = 3, Day = 4, ........ 
    } 

    public static long GetTicks(Something.TypeOf someEnum) 
    { 
     long ticks = 0; 
     switch (someEnum) 
     { 
      case Something.TypeOf.Minute: 
       ticks = TimeSpan.TicksPerMinute; 
       break; 
      case Something.TypeOf.Hour: 
       ticks = TimeSpan.TicksPerHour; 
       break; 
     .... 
     } 
     return ticks; 
    } 
} 


// This class is called from anywhere in the system. 
public static void SomeMethod(string dodo, object o, Something.TypeOf period) 
{ 
    // With the design above 
    long ticks = Something.GetTicks(period); 

    // Traditional, if there was a simple enum 
    if (period == Something.Day) 
     ticks = TimeSpan.FromDays(1).Ticks; 
    else if (period == Something.Hour) 
     ticks = TimeSpan.FromHours(1).Ticks; 
} 

विचार यह है कि एनम से संबंधित जितनी संभव हो सके, एक enum से संबंधित कार्यक्षमता एकत्र करना है। Enum कारण समारोह है। इसके अलावा मुझे enum के पास ऐसी कार्यक्षमता को देखने के लिए यह आसान और स्वाभाविक लगता है। इसके अलावा संशोधित या विस्तार करना आसान है।

मेरे पास जो कमी है, वह है कि मुझे enum को अधिक स्पष्ट Something.TypeOf बताएं। डिजाइन नो-स्टैंडर्ड देख सकता है? और लागू होगा यदि enum कक्षा में आंतरिक उपयोग के लिए था।

आप यह और कैसे अच्छा करेंगे? मैंने अमूर्त, आधार विरासत, आंशिक कोशिश की। उनमें से कोई भी लागू नहीं लगता है।

उत्तर

32

सी # enums इस तरह अच्छी तरह से काम नहीं करते हैं। Noda Time में DateTimeFieldType -

public sealed class Foo 
{ 
    public static readonly Foo FirstValue = new Foo(...); 
    public static readonly Foo SecondValue = new Foo(...); 

    private Foo(...) 
    { 
    } 

    // Add methods here 
} 

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

नकारात्मक पक्ष यह है कि आप स्विच :(उपयोग नहीं कर सकते

+0

पूरी तरह से, वास्तव में समान रूप से! मुझे आपका दृष्टिकोण पसंद है और बाद में इसमें खोद जाएगा जब मैं अनुकूलित करने और इसके लाभों को समझने के लिए समय (यदि कुछ) समझ सकता हूं;))। – Independent

+0

हाँ, जावा जैसी enums। हालांकि मैं एक संरचना का उपयोग करने की सिफारिश करता हूं, कक्षा नहीं। और तेजी से तुलना और स्विच स्टेटमेंट के लिए _Value_ फ़ील्ड। – IllidanS4

+0

@ IllidanS4: मुझे कोई संरचना का उपयोग करने के लिए कोई विशेष नहीं दिखता है - और एक वर्ग अलग-अलग उप-वर्गों (जैसे जावा एनम्स) को लागू करने के लिए विभिन्न उप-वर्गों की अनुमति देता है। इसके अतिरिक्त, एक संरचना का अर्थ होगा 'डिफ़ॉल्ट (फू)' हमेशा एक "असली" मान था, जो गर्दन में दर्द हो सकता है। हालांकि मुझे यकीन है कि ऐसे मामले हैं जहां एक संरचना संस्करण उपयुक्त होगा, मैं अक्सर कक्षाओं का उपयोग करता हूं। –

71

आप थोड़ा और लेखन कोई आपत्ति नहीं है आप enum के इंटरफेस का विस्तार करने के लिए एक विस्तार के तरीकों से कर सकते हैं जैसे

है।

public enum TimeUnit 
{ 
    Second, 
    Minute, 
    Hour, 
    Day, 
    Year, 
    /* etc */ 
} 
public static class TimeUnitExtensions 
{ 
    public static long InTicks(this TimeUnit myUnit) 
    { 
     switch(myUnit) 
     { 
      case TimeUnit.Second: 
       return TimeSpan.TicksPerSecond; 
      case TimeUnit.Minute: 
       return TimeSpan.TicksPerMinute; 
      /* etc */ 
     } 
    } 
} 

यह आपके enums करने के लिए "उदाहरण" तरीकों जोड़ सकते हैं। यह एक थोड़ा और अधिक तुलना में सबसे वर्बोज़ हालांकि की तरह है।

याद रखें, हालांकि एक enum ज्यादातर व्यवहार किया जाना चाहिए एक नामित मूल्य के रूप में।

+0

आप 'टाइमयूनीट एक्सटेंशन' को 'टाइमयूनीट' और 'टाइमस्पेन' उदाहरण से कैसे जोड़ते हैं जिसके लिए आप टिक चाहते हैं? मुझे कुछ संदर्भ याद आ रहे हैं और इसमें कोई संदेह नहीं है कि सी # ज्ञान की कमी मेरी मदद नहीं कर रही है। –

+2

@ डेविड हार्केनेस, यह इस पंक्ति में "यह" की वजह से है: सार्वजनिक स्थैतिक लंबी इनटिक्स (इस टाइम यूनीट myUnit)। "यह" सहयोगी TimeUnit विस्तार करने के लिए। – Seva

+0

मुझे जॉन का जवाब पसंद है, लेकिन यह भी एक संभावना है। +1, मैंने इसके लिए एक्सटेंशन विधियों पर विचार नहीं किया था! – Joel

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