2010-06-24 9 views
5

मैं आवेदन के लिए नए मॉडल की संरचना करना होगा और मैं क्या नहीं बेहतर है कार्य करें:विरासत या enum

वंशानुक्रम का उपयोग या वस्तु के प्रकार के रूप में enum का उपयोग कर:

उदाहरण के लिए:

पुस्तकें

class Book 
{ 
public string Name {get;set;} 

public string Author {get;set;} 

public int NumberOfPages {get;set;} 

} 

public class Encyclopedie:Book 
{ 

} 

public class Novel:Book 
{ 

} 

या बेहतर उपयोग:

class Book 
{ 

public BookType Type {get;set;} 

public string Name {get;set;} 

public string Author {get;set;} 

public int NumberOfPages {get;set;} 

} 

public enum BookType 
{ 
Encyclopedie = 0, 
Novel = 1, 
... 
} 

उत्तर

21

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

यदि आपको केवल विभिन्न प्रकार की किताबों को अलग करने के लिए एक तरीका चाहिए, तो Enum के साथ जाएं।

+0

बिल्कुल सहमत हैं। मैं अभी सोच रहा था कि "महत्वपूर्ण अंतर" कैसे व्यक्त किया जाए। गरीब अंग्रेजी :( –

+1

सहमत हैं। ऐसा लगता है कि वह केवल इसे अलग-अलग प्रकार के रूप में देखना चाहता है। विरासत एक मजबूत युग्मन बनाता है, और जब आपके पास शैलियों को पार करने वाली कोई पुस्तक होती है तो क्या होता है? एकाधिक विरासत की अनुमति देने के लिए C++ पर स्विच करें? ए [ध्वज] 'ed enum यहां एक अच्छी पसंद हो सकती है। – simendsjo

+0

+1 एक बहुत ही स्पष्ट उत्तर के लिए। एकमात्र सही उत्तर IMHO। – pyrocumulus

0

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

2

मैं कहूंगा कि दूसरा बेहतर होगा क्योंकि आप वास्तव में अपने विश्वकोष में पुस्तक वर्ग का विस्तार नहीं कर रहे हैं, वहां कोई अतिरिक्त गुण या कार्यक्षमता नहीं है जिसे आपको एक पुस्तक प्रकार को दूसरे पर देने की आवश्यकता है।

2

"सर्वश्रेष्ठ" वर्ग/मॉडल के उद्देश्य के आधार पर व्यक्तिपरक और भारी है। आपका लक्ष्य क्या है? आपकी क्या प्राप्त करने की इच्छा है?

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

0

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

यदि वे सभी एक ही गुण होंगे, तो आप भी enum के साथ जा सकते हैं। लेकिन यह सब आवेदन पर निर्भर करता है।

-1

आपके ऑब्जेक्ट को "टाइप" करने के लिए एक enum का उपयोग करके "पुराने सी-शैली" प्रोग्रामिंग का थोड़ा सा लगता है।

मेरा मतलब है, यह ठीक है, लेकिन जब विरासत उपलब्ध है (आप सी # का उपयोग कर रहे हैं) यह आम तौर पर बेहतर विकल्प है। एक enum आम तौर पर कुछ "परेशानी" पेश करता है उदाहरण के लिए जब डेटा को क्रमबद्ध/deserializing: क्या होगा यदि आपके आवेदन का एक पुराना संस्करण एक "नया" परिदृश्य का उपयोग करता है जिसमें एक बुकटाइप एक अज्ञात आइटम है? (पिछड़ा/आगे संगतता आपके ऐप के लिए एक आवश्यकता हो सकती है)

बेशक, आप इसे "if-then-else" के बाउंस के साथ संभाल सकते हैं लेकिन विरासत मेरे दृष्टिकोण में एक क्लीनर विकल्प लगता है।

अलविदा!

+0

डेटा को deserializing जब आप विरासत कक्षाओं के बीच अंतर कैसे करेंगे? एकमात्र तरीका है कि मैं प्रत्येक उदाहरण के साथ कक्षा का नाम शामिल करना है serialized ऑब्जेक्ट (जिसे आप enum पर टोस्टिंग() को कॉल करके भी कर सकते हैं) – apoorv020

+0

एक एक्सएमएलएसरियलाइज़र टाइप डेटा लौटाता है - सुनिश्चित करें कि आप एक enum का उपयोग कर सकते हैं और उस पर स्विच कर सकते हैं, लेकिन ऐसा क्यों होता है जब "टाइप" पहले से ही एक ही चीज़ प्रदान करता है? इसके अलावा: यदि आप इसे टाइप करने के लिए केवल एक वर्ग और "enum" का उपयोग करते हैं, तो आपको उस क्लास के विभिन्न प्रकारों से आवश्यक सभी * गुणों को रखना होगा रों। आपके पास "बुकएएए" टाइप करके आवश्यक "XYZ" संपत्ति होगी, लेकिन "नोवेल बीबीबी" टाइप न करें - और यह इतना अच्छा नहीं है, IMHO, जब आप विरासत से बच सकते हैं। –

0

मुझे लगता है कि आपको "उद्देश्य" पुस्तक के आधार पर यह विकल्प बनाना चाहिए। यदि पुस्तकों को किसी भी अतिरिक्त सामान की आवश्यकता नहीं है (विधियों और गुण ....) enum पर्याप्त होना चाहिए। यदि आपको प्रत्येक पुस्तक के लिए एक सामान्य व्यवहार बनाना है और प्रत्येक पुस्तक प्रकार के लिए कुछ और विशिष्ट है तो आपको स्पष्ट रूप से विरासत (अमूर्त वर्ग "पुस्तक" और ठोस कक्षाएं चाहिए)।

3

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

इसलिए यदि आपको विधि आमंत्रण के जवाब में पुस्तक के भीतर विभिन्न व्यवहार को लागू करने की आवश्यकता है, तो पुस्तक का विस्तार करें और इसके कुछ तरीकों को ओवरराइड करें। यदि आप नहीं करते हैं, तो नहीं।

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

मुझे पुस्तक के लिए एक enum का उपयोग करने की आवश्यकता नहीं होगी, क्योंकि आप अधिक डेटा जोड़ना चाहते हैं - मैं या तो एक ढीली टैगिंग प्रणाली का उपयोग करता हूं, ताकि आप एक प्रकार के संग्रह के साथ एक पुस्तक टैग कर सकें - ताकि आप {'बच्चों के', 'ऑर्निथोलॉजिकल', 'एनसाइक्लोपीडिया',} के रूप में टैग की गई एक पुस्तक होगी - या भूमिकाओं में संरचना की अनुमति दें - इसलिए जब आवश्यक हो, 'बच्चों के ऑर्निथोलॉजिकल एनसाइक्लोपीडिया' के लिए एक भूमिका है, लेकिन कोई निश्चित गणना नहीं है।