2009-02-27 14 views
6

असल में मेरे पास एक कस्टम लिस्ट क्लास है जिसमें विभिन्न फलों हैं। मान लें कि प्रत्येक फल में एक आईडी नंबर होता है जो सूची में संग्रहीत होता है।जेनिक्स या जेनरिक नहीं

बेहतर है करने के लिए है:

new AppleList(); 
new OrangeList(); 
new LemonList(); 

या

new FruitList<Fruit.Apple>(); 
new FruitList<Fruit.Orange>(); 
new FruitList<Fruit.Lemon>(); 

विचारणीय बातें:

  • सभी आईडी प्रकार int के हैं।
  • फल का प्रकार सूची के कार्यान्वयन को प्रभावित नहीं करेगा। इसका उपयोग केवल सूची के ग्राहक द्वारा किया जाएगा, जैसे बाहरी विधि, आदि

मैं स्पष्ट, बेहतर, डिजाइन में बेहतर, अधिक कुशल, आदि का उपयोग करना चाहता हूं। इसके अतिरिक्त यदि ये उपर्युक्त 2 तकनीकें सर्वश्रेष्ठ नहीं हैं, कृपया अपने विचारों का सुझाव दें।

संपादित करें: बीटीडब्ल्यू फल एक enum है अगर यह स्पष्ट नहीं था।

+0

आप enums की एक सूची कर रहे हैं ?? यह वास्तव में नहीं है कि सूचियां क्या हैं। enums पहले से ही एक सूची की तरह हैं। –

+0

धन्यवाद, एनम्स की सूची नहीं। यह सिर्फ प्रकार के लिए है। एएलएल इन सूचियों में इंक स्टोर होंगे, जैसे 1,2,3,4। –

+1

मुझे आश्चर्य है कि कितने लोगों को यह समझ में नहीं आया कि आप पूर्णांक की एक सूची संग्रहित कर रहे हैं। –

उत्तर

3

• सभी आईडी प्रकार int हैं।

• फल का प्रकार सूची के कार्यान्वयन को प्रभावित नहीं करेगा। इसका उपयोग केवल सूची के ग्राहक द्वारा किया जाएगा, जैसे बाहरी विधि, आदि

इन दो तथ्यों को देखते हुए, मैं जेनरिक से परेशान नहीं होता। मैं फूटलिस्ट पर एक सामान्य संपत्ति डालूंगा यह इंगित करने के लिए कि यह किस प्रकार का फल है।

+0

उसे ऐसा करने के लिए 3 अलग-अलग सूचियां क्यों बनाए रखनी चाहिए। यहां केवल अंतर ही विभिन्न प्रकार के फल के लिए निहित आईडी है लेकिन यह सूची व्यवहार को प्रभावित नहीं करता है। क्यों न केवल var appleList = नई सूची () का उपयोग करें ... – Beachwalker

7

3 गैर-जेनेरिक संस्करणों की तुलना में 1 जेनेरिक सूची को बनाए रखना बहुत आसान है। क्या तुम सच में AppleList नाम की तरह आप हमेशा चाल का उपयोग कर एक सामान्य सूची नाम के लिए

using AppleList=Fruit.FruitList<Fruit.Apple> 
+0

यदि उसे वास्तव में ऐप्पललिस्ट की आवश्यकता है, तो इसे ऐप्पललिस्ट की तरह दिखने के लिए "चाल" का उपयोग करके वास्तव में इसे ऐप्पललिस्ट नहीं बनाया जाता है। –

+0

मुझे इस वाक्यविन्यास को thsi तरीके से नहीं पता था। तो जब मैं ऐप्पललिस्ट कहता हूं, तो यह FruitList बनाएगा? –

+0

@ जोन हाँ यह सही है – JaredPar

9

उपयोग कर सकते हैं, तो आप जेनरिक का उपयोग करते हैं, वहाँ FruitList प्रकार बनाने के लिए एक उद्देश्य है? क्या आप सिर्फ सूची का उपयोग कर सकते हैं?

प्रदर्शन में बहुत अंतर नहीं होगा, इसलिए मैं कहता हूं कि तीन अलग-अलग वर्ग क्यों बनाते हैं जब कोई वही काम करता है? जेनेरिक समाधान का प्रयोग करें।

+0

धन्यवाद, हाँ फ्रूटलिस्ट नए इंटरफेस को लागू करने के लिए आवश्यक है और इसमें कुछ कार्यक्षमता भी है जो सूची नहीं है। –

+0

क्या पसंद है? सामान्य कार्यक्षमता पर एक्सटेंशन विधियों के साथ आपकी कार्यक्षमता पर कार्य नहीं किया जा सका? "नए इंटरफेस को लागू करने के लिए जरूरी" से आपका क्या मतलब है? –

+0

मैं उस वर्ग में विस्तार विधियों की अनुशंसा नहीं करता जिस पर नियंत्रण है। – gcores

10

उपयोग एक कॉम्बो:

public class AppleList : FruitList<Apple> { ... } 
public class OrangeList : FruitList<Orange> { ... } 
public class LemonList : FruitList<Lemon> { ... } 

आधार सूची कक्षा में आम तर्क रखो:

public class FruitList<T> : List<T> 
    where T : IFruit 
{ ... } 
+0

धन्यवाद, यह मुझे लगता है कि यह काम नहीं करेगा। क्योंकि सभी फल सूचियां 100% समान होंगी। लेकिन मुझे अभी भी उन्हें अलग-अलग अंतर करने का एक तरीका चाहिए। –

+1

यदि वे सभी समान हैं, तो आप केवल ऐप्पललिस्ट कर सकते हैं: सूची

+0

धन्यवाद। क्या ऐप्पल आपके मामले में एक वर्ग है? सूची से विरासत क्यों? बस सोच रहा। –

3

पुन: उपयोग सामान्य संग्रह वर्गों और उन्हें उपवर्ग आप अतिरिक्त कार्यक्षमता जोड़ रहे हैं केवल यदि। यदि आप कर सकते हैं तो अपने सबक्लास कार्यान्वयन सामान्य रखें। यह कम से कम जटिल कार्यान्वयन है।

1

जेनेरिक सूची का उपयोग करें, क्रेटिंग 3 सूचियों में कोई बिंदु नहीं है और यह हमेशा के लिए अमूर्तता का स्तर रखने के लिए अच्छा है। (IFruit एक अच्छा इंटरफ़ेस होगा)।

+0

के शीर्ष पर बना सकते हैं IFruit क्या है? यह सूची में संग्रहीत इंटेगर्स पर लागू नहीं होगा। –

+0

क्यों न केवल var appleList = नई सूची () का उपयोग करें; रोकथाम को बाहरी रूप से परिभाषित किया जा सकता है आप केवल एक वर्ग फलसूची बना सकते हैं: सूची {फल प्रकार {प्राप्त करें; }} – Beachwalker

0

आपको YAGNI मानना ​​चाहिए जब तक कि आपको इसकी आवश्यकता न हो। इसलिए, यदि आपको सूची में आने से अधिक चीज की आवश्यकता नहीं है, तो बस List<T>।आप सूची को ओवरराइड करने के लिए है किसी कारण से, तो

FruitList<T> : List<T> where T : Fruit 

बनाते हैं अपनी सूची वितरित हो जाते हैं और अब बहुरूपी हैं, तो आपके कस्टम सूचियों लागू करने पर विचार:

  • AppleList
  • OrangeList
  • LemonList

सर्वोत्तम यो के रूप में प्रयास करें हालांकि, आप अपने उत्तराधिकारी को अपने समाधान को कम करने से बचने के लिए यथासंभव सपाट पदानुक्रम रखने के लिए कर सकते हैं।

+0

आप नहीं सुन रहे थे। सूची में फलों नहीं, पूर्णांक होते हैं। –

+0

वास्तव में मुझे यह नहीं पता: सूची एक मुहरबंद कक्षा नहीं है? –

+0

सूची निश्चित रूप से बंद नहीं है। –

1

मैं स्वीकार किए जाते हैं जवाब की सिफारिश नहीं होगा और मुझे लगता है कि आप इस के बजाय की तरह कुछ का मतलब:

public enum Fruit 
{ 
    Apple, 
    Orange, 
    Lemon 
} 

public interface IFruitList : IList<int> 
{ 
    Fruit Type { get; } 
}; 

public class FruitList : List<int>, IFruitList 
{ 
    private readonly type; 

    FruitList(Fruit type) 
    : base() 
    { 
     this.type = type; 
    } 

    FruitList(Fruit type, IEnumerable<int> collection) 
    : base(collection) 
    { 
     this.type = type; 
    } 

    Fruit Type { return type; } 
} 
संबंधित मुद्दे