2010-03-16 13 views
6

क्या किसी के पास यहां उपयोगकर्ता विरासत कब और कब पहचानकर्ता का उपयोग करने के बारे में राय है?विरासत या पहचानकर्ता

विरासत उदाहरण:

class Animal 
{ 
    public int Name { get; set; } 
} 

class Dog : Animal {} 

class Cat : Animal {} 

पहचानकर्ता उदाहरण:

class Animal 
{ 
    public int Name { get; set; } 

    public AnimalType { get; set; } 
} 

क्या स्थितियों में मैं जो समाधान को प्राथमिकता देनी चाहिए और पेशेवरों और उनके लिए विपक्ष क्या हैं?

/लीना

+1

http://stackoverflow.com/questions/269496/inheritance-vs- समेकन –

+0

@jleedev: यह एकत्रीकरण या संरचना नहीं है। कम से कम सख्ती से नहीं। –

+0

हम्म, मुझे धीमा होना चाहिए। –

उत्तर

2

मैं विरासत का प्रयोग करेंगे, अगर इनहेरीट वर्गों (बिल्ली और कुत्ता अपने उदाहरण में) एक अलग इंटरफेस (तरीकों या क्षेत्रों) है, या वे अलग व्यवहार का चयन करने के लिए उपयोग किया जाता है। उदाहरण के लिए एक वास्तविक परियोजना में मेरे पास HTML-कोड उत्पन्न करने के लिए बेस-क्लास है। स्थिति के आधार पर मैं सही उपclass बना देता हूं, जो सही HTML उत्पन्न करता है। इस वर्ग में (ज्यादातर) एक ही इंटरफ़ेस है, लेकिन उनका व्यवहार इतना अलग है, कि मैं इसे चुनना या स्विच करना नहीं चाहता हूं।

6

यह आपके सिस्टम में किए जाने वाले कार्यों के प्रकार पर निर्भर करता है। उदाहरण के लिए आप कुछ सामान्य कार्रवाई है कि आपके वस्तुओं में से प्रत्येक के लिए अलग तरीके से किया जाना चाहिए की तुलना में आप विरासत का उपयोग करना चाहिए, जैसे अगर:

class Shape 
{ 
    public abstract void Draw(); 
} 

class Circle : Shape 
{ 
    public override void Draw() 
    { 
     /* Custom implementation for Circle. */ 
    } 
} 

class Box : Shape 
{ 
    public override void Draw() 
    { 
     /* Custom implementation for Box. */ 
    } 
} 

दूसरी ओर अगर किसी प्रकार की और की तरह अधिक दिखता वस्तु पर अपनी संपत्ति का उपयोग करना चाहिए क्या आप "पहचानकर्ता" के रूप में कहा:

enum Color 
{ 
    Red, 
    Green, 
    Blue 
} 

class Box 
{ 
    public Color BoxColor { get; set; } 
} 

आप विरासत का उपयोग कर सकते (लेकिन यह इतना अच्छा नहीं दिखता है): Redbox, Bluebox, आदि अंतर यह है कि सभी बक्से (यहां तक ​​कि लोगों को विभिन्न रंगों के साथ) उसी तरह से संभाला जाएगा और उनका व्यवहार आम होगा।

1

इस पर एक नज़र डालें कि आप कोड का उपयोग कैसे करते हैं और आप इसका उपयोग कैसे करते हैं। मुझे लगता है कि विरासत हमेशा खुद को उधार देती है जब आपके पास अलग-अलग वस्तुएं होती हैं जिनके पास बहुरूपता का अच्छा अवसर होता है।

एक प्रवेश समाधान के बारे में सोचो, log(string info) लॉग इन करने के रास्ते एक उद्देश्य यह है कि क्या अपने कर में अलग है, इस तरह के डिस्क के लिए प्रवेश के रूप में करने के लिए विरासत में मिला दिया जाना चाहिए, नेटवर्क के, स्क्रीन आदि लॉग इन करें)

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

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

1

विरासत मेरे दिमाग में है, जब दिए गए पहचानकर्ता के अनुसार व्यवहार बदलना चाहिए तो प्राथमिकता। उदाहरण के तौर पर, यदि tyou बस अपने Animalwalk() विधि प्रदान करना चाहते हैं, तो आपको उप-वर्ग (जैसे कुत्तों और बिल्लियों को दूर से, उसी तरह से चलने के लिए) प्रदान करने की आवश्यकता नहीं है।

हालांकि, अगर आप उन्हें कुछ makeNoise(Mood mood) विधि करना चाहते हैं, विरासत उपयोगी होगा:

class Cat { 
    public void makeNoise(Mood mood) { 
     swithch(mood) { 
      case happy: 
       purr(); 
       break; 
       // and so on 
4

क्या आप एक "पहचानकर्ता" कहते हैं मैं एक enum दृष्टिकोण कहेंगे।

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

0

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

3
  • यदि जानवरों के बीच एकमात्र अंतर उनके प्रकार है, तो AnimalType संपत्ति का उपयोग करें।

  • यदि विभिन्न जानवरों के पास गुणों और विधियों या अतिरिक्त लोगों के विभिन्न कार्यान्वयन होते हैं, तो Animal से प्राप्त कक्षाएं बनाएं।

    यदि जानवर के प्रकार की जांच करना आम बात है, तो संपत्ति प्रदान करने पर विचार करें, is/as के बहुत से विकल्प के रूप में।

1

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

2

विरासत एक जानवर के लिए बिल्ली और कुत्ते के व्यवहार को कसकर जोड़ देगा। जो भी आप चाहते हैं हो सकता है।

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

लेकिन आप इस आगे ले जा सकते हैं।

के अनुसार Gang of Fours design patterns आपको चाहिए

"फ़ेवर 'वस्तु रचना' 'वर्ग विरासत' पर।"

एक जानवर केवल एक कुत्ता है क्योंकि इसकी एक पूंछ है जो wags और यह छाल है। अपने ब्रह्मांड में जहां समय के साथ एक कुत्ता बात करना सीख सकता है, आप इस व्यवहार को संशोधित करने में सक्षम होना चाहेंगे।

फिर आप इसके व्यवहार को सारणी देने का प्रयास कर सकते हैं, और फिर इस व्यवहार के भीतर आप विरासत का उपयोग कर सकते हैं।

इस वर्ग संरचना के साथ

:

class Tail 
{ 
    DoYourThing() 
} 

class WaggyTail : Tail 
{ 
    DoYourThing() 
    { 
    // Wag 
    } 
} 

class Noise 
{ 
    DoYourThing() 
} 

class Bark : Noise 
{ 
    DoYourThing() 
    { 
    // Bark 
    } 
} 

class Talk : Noise 
{ 
    DoYourThing() 
    { 
    // Talk 
    } 
} 

class Animal 
{ 
    public Noise { get; set; } 
    public Tail { get; set; } 
} 

आप अपने बिल्लियों और कुत्तों की स्थापना कर सकते हैं:

Animal dog = new Animal { Noise = new Bark(), tail = new DoggyTail() } 
    Animal cat = new Animal{ Noise = new Purr(), tail = new CattyTail() } 

.. तो जब आप अपने सुपर जरूरत नस्ल आप साधारण परिवर्तन उनके व्यवहार कर सकते हैं

कुत्ता।शोर = नई बात();

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

0

ठीक है, कक्षाओं के अलग-अलग व्यवहार होने पर अंगूठे का मेरा नया नियम विरासत के लिए जाना होगा, अन्यथा मैं किसी प्रकार के पहचानकर्ता के लिए जाऊंगा। (बेशक अंतिम निर्णय पर्यावरण पर निर्भर करेगा जिसमें कक्षाओं का उपयोग किया जाएगा)। आपके सभी उत्तरों के लिए धन्यवाद!

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