2013-10-23 15 views
5

मैं कई enums बनाने की कोशिश कर रहा हूं, जो Dropdown.Category.Subcategory का सिंटैक्स देता है। हालांकि, मैं पढ़ रहा हूं कि यह इतना अच्छा विचार नहीं है। इसके लिए मेरी पसंद अधिकतर थी क्योंकि मैं श्रेणी के विकल्प के आधार पर अलग-अलग enum मूल्यों का चयन करने के किसी भी अन्य तरीके से नहीं सोच सकता था, और फिर उपश्रेणी की पसंद enumenum मानों के आधार पर चयनित enum के अधीन है।घोंसले के घोंसले के लिए वैकल्पिक

क्या ऐसी कार्यक्षमता बनाने का कोई बेहतर तरीका है? मैं .Category और .Subcategory दोनों नामों को आसानी से पहचानने में सक्षम होना पसंद करूंगा, और यह कोड बोनस होगा यदि यह कोड पठनीय था।

बस इसे स्पष्ट करने के लिए, मैं Category चुनने में सक्षम होना चाहता हूं, फिर उपयुक्त Subcategory चयन करें।

public class Dropdown 
{ 
    public enum Gifts 
    { 
     GreetingCards, 
     VideoGreetings, 
     UnusualGifts, 
     ArtsAndCrafts, 
     HandmadeJewelry, 
     GiftsforGeeks, 
     PostcardsFrom, 
     RecycledCrafts, 
     Other 
    } 
    public enum GraphicsAndDesign 
    { 
     CartoonsAndCaricatures, 
     LogoDesign, 
     Illustration, 
     EbookCoversAndPackages, 
     WebDesignAndUI, 
     PhotographyAndPhotoshopping, 
     PresentationDesign, 
     FlyersAndBrochures, 
     BusinessCards, 
     BannersAndHeaders, 
     Architecture, 
     LandingPages, 
     Other 
    } 
} 
+1

आप क्या पढ़ रहे थे, और यह क्यों कहा गया कि यह एक अच्छा विचार नहीं था? ज्यादातर मामलों में एनम्स कक्षाओं में घोंसला नहीं होना चाहिए; वे एक शीर्ष स्तर पर होना चाहिए, लेकिन यह एक उचित पर्याप्त संदर्भ की तरह लगता है। ज्यादातर मामलों में हालांकि यह हर समय अपने माता-पिता के माध्यम से एक enum तक पहुंचने के लिए परेशान है। यदि यह किसी निश्चित संदर्भ में फायदेमंद है, तो यह ठीक है। – Servy

+0

क्या आप वाकई डेटाबेस की आवश्यकता नहीं है? – acfrancis

+0

यदि उन enums का उपयोग केवल ड्रॉपडाउन कक्षा के भीतर किया जाता है, तो ऐसा करने का कोई कारण नहीं है कि आप वर्तमान में क्या कर रहे हैं। –

उत्तर

4

एक वर्ग है कि बाहर से से विरासत में मिला नहीं किया जा सकता बनाएं, यह कई भीतरी वर्गों, प्रत्येक से विस्तार दे। एक विधि के लिए एक पैरामीटर

public class Dropdown 
{ 
    private string value; 

    //prevent external inheritance 
    private Dropdown(string value) 
    { 
     this.value = value; 
    } 

    public class Gifts : Dropdown 
    { 
     //prevent external inheritance 
     private Gifts(string value) : base(value) { } 

     public static readonly Dropdown GreetingCards = 
      new Gifts("GreetingCards"); 
     public static readonly Dropdown VideoGreetings = 
      new Gifts("VideoGreetings"); 
     public static readonly Dropdown UnusualGifts = 
      new Gifts("UnusualGifts"); 
     public static readonly Dropdown ArtsAndCrafts = 
      new Gifts("ArtsAndCrafts"); 
    } 
    public class GraphicsAndDesign : Dropdown 
    { 
     //prevent external inheritance 
     private GraphicsAndDesign(string value) : base(value) { } 

     public static readonly Dropdown CartoonsAndCaricatures = 
      new GraphicsAndDesign("CartoonsAndCaricatures"); 
     public static readonly Dropdown LogoDesign = 
      new GraphicsAndDesign("LogoDesign"); 
     public static readonly Dropdown Illustration = 
      new GraphicsAndDesign("Illustration"); 
    } 

    public override string ToString() 
    { 
     return value; 
    } 
} 

इस मामले हर एक मूल्य वास्तव में प्रकार Dropdown का एक उदाहरण है, तो आप हो सकता था, कहते हैं,: फिर से प्रत्येक मान के है कि आप का प्रतिनिधित्व करना चाहते हैं के लिए स्थिर पढ़ने केवल चर जोड़ें जो Dropdown उदाहरण स्वीकार करता है। Enums के साथ कहने का कोई तरीका नहीं है, "मैं Dropdown कक्षा में घोषित किसी भी enums स्वीकार करना चाहता हूँ।"

public static void UseDropdown(Dropdown type) 
{ 
    if (type is Dropdown.Gifts) 
    { 
     if (type == Dropdown.Gifts.GreetingCards) 
     { 
      DoStuff(); 

     } 
    } 
    else if (type is Dropdown.GraphicsAndDesign) 
    { 
    } 
} 

तुम भी एक पैरामीटर है कि, प्रकार Gifts या GraphicsAndDesign की एक वस्तु को स्वीकार करता है यदि आप केवल एक उप-प्रकार कुछ संदर्भ में मान्य होना चाहते हो सकता है:

यहां कुछ उदाहरण उपयोग है।

अफसोस की बात है कि इस समाधान का उपयोग switch पर ड्रॉपडाउन मूल्य पर कोई अच्छा तरीका नहीं है; मूल्यों की जांच करने के लिए आपको केवल if/else if श्रृंखला का उपयोग करना होगा।

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

Equals और GetHashCode कार्यान्वयन को बिना किसी ओवरराइड किए छोड़े जाने पर सार्थक होना चाहिए।

यदि आप असली enums की तरह वस्तुओं को तार्किक रूप से आदेश दिया जाना चाहिए तो आप IComparable लागू कर सकते हैं।

+0

मेरा +1 से बेहतर समाधान।मैं अपनी हटाने के बारे में सोच रहा हूं ;-( – Harrison

+0

कहना है, यह वास्तव में भी सुरुचिपूर्ण है। बहुत बहुत धन्यवाद, मुझे यह पसंद है! –

+0

छोटी समस्या, यह वाक्यविन्यास वैध कोड है, क्योंकि 'ड्रॉपडाउन' की विरासत की वजह से: 'ड्रॉपडाउन .Gifts.GraphicsAndDesign.Gifts.GraphicsAndDesign', आदि –

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