2009-03-09 19 views
5

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

स्पष्टीकरण के लिए, जैसा कि मैंने अभी तक किया है, परियोजना नीचे है। मेरे पास अभी तक भरने वाले कुत्ते/बिल्ली वर्ग आदि नहीं हैं। क्या आप मुझे एक सूचक दे ​​सकते हैं। मैं किसी को भी "जवाब" देने के लिए नहीं कह रहा हूं। मैं बस इस पर जाने के लिए खो गया हूँ। मैं ऑनलाइन पाठ्यक्रम लेता हूं और मेरे साथ उनके संचार प्रयास परेशान कर रहे हैं। मैं बस अपने सभी अन्य पाठ्यक्रमों के साथ 4.0 के साथ समाप्त हुआ, इसलिए मैं प्रयास करने के लिए तैयार हूं, लेकिन मैं इन अवधारणाओं की समझ में और कैसे उन्हें व्यावहारिक रूप से लागू करने के लिए खो गया हूं।

कोई टिप्पणी या मदद जो मुझे इस परियोजना में आगे बढ़ने देगी?

क्या मैं लागू करने के लिए इस प्रकार है कर रहा हूँ के विवरण:

अवलोकन:

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

आप सफलतापूर्वक काम को पूरा करते हैं, तो अपने कार्यक्रम उत्पादन निम्नलिखित बयानों चलाना चाहिए जब:

मेरा नाम स्पॉट है, मैं एक कुत्ता

मेरा नाम फेलिक्स है, मैं एक बिल्ली कर रहा हूँ कर रहा हूँ

आवश्यकताएँ:

1) आप एक सार आधार वर्ग 'पशु' नामक होना आवश्यक है जहाँ से कुत्ता और बिल्ली ग लेस व्युत्पन्न

2) पशु आधार वर्ग इंटरफेस 'IAnimal' से प्राप्त करना चाहिए, यह केवल वर्ग कि IAnimal से निकाले जाते हैं चाहिए।

3) के बाद से सभी जानवरों को एक नाम है और एक नाम एक विशेषता है जो एक कुत्ते या बिल्ली, पशु

आधार वर्ग होना चाहिए जहां नाम संग्रहीत किया जाता है और जहां के लिए विशिष्ट है नहीं है WhatIsMyName प्राप्त-संपत्ति लागू की गई है।

4) आपको एक कुत्ता और बिल्ली वर्ग बनाना होगा जो केवल पशु आधार वर्ग से प्राप्त होगा।

5) कुत्ते और बिल्ली वर्गों को व्हाटएएमआई प्राप्त संपत्ति को लागू करना चाहिए और उचित स्ट्रिंग मान वापस कर देना चाहिए।

कोड आप नहीं बदल सकते हैं:

using System; 

namespace IT274_U2 
{ 
    public interface IAnimal 
    { 
     string WhatAmI { get; } 
     string WhatIsMyName { get; } 
    } 

    public class TesterClass 
    { 
     public static void DescribeAnimal(IAnimal animal) 
     { 
      Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI); 
     } 

     static void Main(string[] args) 
     { 
      Dog mydog = new Dog("Spot"); 
      Cat mycat = new Cat("Felix"); 
      DescribeAnimal(mydog); 
      DescribeAnimal(mycat); 
     } 
    } 
} 

///////////////////////

कोड मैं '

using System; 


namespace IT274_U2 
{ 
    public interface IAnimal 
    { 
     string WhatAmI { get; } 
     string WhatIsMyName { get; } 
    } 


    public class Dog 
    { 
     public abstract string WhatAmI 
     { 
      get; 
      set; 
     } 
    }//end public class Dog 

    public class Cat 
    { 
    public abstract string WhatIsMyName 
    { 
     get; 
     set; 
    } 
    }//end public class Cat 

    public abstract class Animal : IAnimal 
    { 
    // fields 
    protected string Dog; 
    protected string Cat; 

        // implement WhatIsMyName 

    //properties 
    public abstract String Dog 
    { 
     get; 
     set; 
    } 
    public abstract String Cat 
    { 
     get; 
     set; 
    } 
    public abstract string WhatIsMyName(); 

    } //end public abstract class Animal 


    public class TesterClass 
    { 
     public static void DescribeAnimal(IAnimal animal) 
     { 
      Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI); 
     } 

     static void Main(string[] args) 
     { 

      Dog mydog = new Dog("Spot"); 
      Cat mycat = new Cat("Felix"); 
      DescribeAnimal(mydog); 
      DescribeAnimal(mycat); 
     } 
    } 
} 
+0

क्या आपके कोड में कोड नमूना है जिसे आपको संशोधित करने की अनुमति नहीं है? –

+0

@ माइक - बस मैं पूछने वाला था :) –

+0

प्रोफेसर द्वारा दिए गए कोड और मैंने जो कोड लिखा है उसके साथ ऊपर दिए गए प्रश्न को अद्यतन किया। इसके लिए धन्यवाद, मैंने भी विचार नहीं किया। उसने मुझे बताया कि मेरे पास सामान्य रूपरेखा ठीक है, लेकिन फिर वह मुझे सत्र से बहुत जल्दी धक्का दे रहा था, इसलिए केवल संक्षेप में देखा। – SheldonH

उत्तर

6

संपादित करें:

मैं प्रत्येक वर्ग के बाहर के लिए कोड के शरीर ले लिया है - आप मेरे जवाब देखने के लिए चाहते हैं, संपादित संशोधन :)

सबसे पहले हमें परिभाषित पर एक नजर है interface

public interface IAnimal 
{ 
    string WhatAmI { get; } 
    string WhatIsMyName { get; } 
} 

किसी भी वर्ग को लागू करता है कि इस इंटरफेस इन गुणों को लागू करना चाहिए। एक इंटरफेस एक अनुबंध की तरह है; एक इंटरफ़ेस को लागू करने वाला एक वर्ग इंटरफ़ेस के तरीकों, गुणों या इंडेक्सर्स के कार्यान्वयन को प्रदान करने के लिए सहमत होता है।

इसके बाद, हम उस वर्ग abstract इंगित करता है कि वर्ग केवल अन्य वर्गों के लिए एक आधार वर्ग होने के लिए बनाई गई है, अपने सार पशु वर्ग

public abstract class Animal : IAnimal 
{ 
    //Removed for Training, See Edit for the code 
} 

तथ्य को परिभाषित करने की जरूरत है। हमने इंटरफेस के दोनों गुणों को लागू किया है और जानवरों के नाम को स्टोर करने के लिए एक निजी क्षेत्र भी है। इसके अलावा, हमने WhatAmI संपत्ति एक्सेसर सार बनाया है ताकि हम प्रत्येक व्युत्पन्न कक्षा में अपने विशिष्ट संपत्ति एक्सेसर तर्क को कार्यान्वित कर सकें और एक कन्स्ट्रक्टर को भी परिभाषित किया हो जो एक स्ट्रिंग तर्क स्वीकार करता है और _name निजी फ़ील्ड को मान निर्दिष्ट करता है।

अब, चलो हमारे Cat और Dog कक्षाएं

public class Dog : Animal 
{ 
    //Removed for Training, See Edit for the code 
} 

public class Cat : Animal 
{ 
    //Removed for Training, See Edit for the code 
} 

दोनों वर्गों Animal से विरासत और प्रत्येक एक निर्माता है कि एक स्ट्रिंग तर्क को परिभाषित करता है और आधार निर्माता के लिए एक पैरामीटर के रूप में उस तर्क से गुजरता है परिभाषित करते हैं। इसके अलावा, प्रत्येक वर्ग क्रमशः WhatAmI के लिए अपने स्वयं के प्रॉपर्टी एक्सेसर को लागू करती है, क्रमशः उनके प्रकार की एक स्ट्रिंग लौटती है।

कोड

public class Program 
{ 
    public static void DescribeAnimal(IAnimal animal) 
    { 
     Console.WriteLine("My name is {0}, I am a {1}", animal.WhatIsMyName, animal.WhatAmI); 
    } 

    static void Main(string[] args) 
    { 
     Dog mydog = new Dog("Spot"); 
     Cat mycat = new Cat("Felix"); 
     DescribeAnimal(mydog); 
     DescribeAnimal(mycat); 
     Console.ReadKey(); 
    } 
} 

स्थिर विधि DescribeAnimal एक तर्क के रूप में एक IAnimal स्वीकार करता है और बाहर मूल्यों IAnimal में पारित के लिए WhatIsMyName और WhatAmI संपत्ति accessors द्वारा दिया लिखते के बाकी समय में।

Animal के बाद से IAnimal लागू करता है और दोनों Dog और Animal से Cat इनहेरिट, किसी भी Cat या Dog वस्तु DescribeAnimal विधि के लिए एक पैरामीटर के रूप में पारित किया जा सकता है।

मुझे आशा है कि मैंने यह स्पष्ट रूप से समझाया है, अगर किसी को लगता है कि शब्दों की मेरी पसंद को कसने की जरूरत है, तो कृपया टिप्पणी करें और मुझे अपना जवाब संपादित करने में खुशी होगी।

+0

ईमानदारी से, मैं आपकी सभी टिप्पणियों को पूरी तरह से पढ़ने से परहेज कर रहा हूं क्योंकि मुझे अपनी परियोजना के जवाब को "पढ़ने" पसंद नहीं है, लेकिन एमएसडीएन को दिए गए लिंक ने "नमूना" कोड दिया है जिसने मुझे अपनी परियोजना को आगे बढ़ाने में मदद की है वहां मदद के लिए धन्यवाद! – SheldonH

+1

अच्छी चीजें :) मुझे बताएं कि क्या आप मुझे अपना जवाब हटाना चाहते हैं, या एक बार जब आप अपना समाधान –

+0

नहीं प्राप्त कर लेते हैं, तो मुझे वापस आने के लिए छोड़ दें, मैं मदद की सराहना करता हूं, मैं इसे पूरा करने के बाद इसकी समीक्षा करूंगा मेरी तरफ देखने के लिए कि क्या मुझे सही विचार मिल गया है। यह वास्तव में मेरे लिए सबसे अवधारणाओं से समझने के लिए बहुत कठिन रहा है ... पाठ्यपुस्तक वास्तव में बेकार है, मेरे पास एक उच्च पढ़ने का स्तर है, लेकिन यह इतना शुष्क है, मुझे ध्यान देने से पहले 1-2 पैराग्राफ मिलते हैं – SheldonH

6

एक अंतरफलक और एक अमूर्त वर्ग के बीच मुख्य अंतर यह है कि इंटरफ़ेस में आप केवल परिभाषित क्या सार्वजनिक तरीकों और ऑब्जेक्ट के गुणों कि इस interfac लागू करता है यह होना चाहिए: अब तक लिखा ve ई। एक अमूर्त वर्ग कुछ आधार कार्यान्वयन प्रदान करता है, लेकिन इसमें कुछ "अंतराल" होते हैं - अमूर्त विधियों को जो विरासतकर्ता को कार्यान्वित करने की आवश्यकता होती है।

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

0

सार कक्षाएं: व्युत्पन्न कक्षाओं के लिए आधार स्थापित करें वे सभी व्युत्पन्न कक्षाओं के लिए अनुबंध प्रदान करते हैं। यह heirarchies लागू करता

इंटरफेस:

एक इंटरफेस एक वर्ग नहीं है, तरीकों में से एक परिभाषा।

एक कक्षा कई इंटरफेस में प्रवेश कर सकती है लेकिन केवल एक सार वर्ग है।

मुझे आशा है कि

+0

"एक इंटरफेस एक वर्ग नहीं है, इसकी विधियों की परिभाषा" ओएच है। .. मैंने सोचा कि यह एक वर्ग का एक प्रकार था ?? तुम कह रहे हो यह नहीं है? इससे बहुत मदद मिलती है! – SheldonH

+0

"एक इंटरफ़ेस एक विशेष प्रकार का सी # वर्ग है जो पॉलिमॉर्फिक स्टस्टिटन और विरासत के बिना देर से बाध्यकारी का समर्थन करता है।" आधुनिक सॉफ्टवेयर डिजाइन - रिचर्ड वीनर यह माना जाता है कि एक इंटरफेस एक वर्ग नहीं है, कोई टिप्पणी है? – SheldonH

+0

@ शेल्डन मैं अपनी टिप्पणी से खड़ा हूं कि एक इंटरफेस एक वर्ग नहीं है यह एक अनुबंध है – CodeMonkey

3

आप निकट पहुंच गए हैं में मदद करता है, लेकिन इस मुश्किल की तुलना में यह करने की जरूरत बन गया है।

मैं आपको जवाब देना नहीं चाहता;) लेकिन यहां कुछ पॉइंटर्स हैं।

सबसे पहले, आप 3 कक्षाएं और 1 इंटरफ़ेस बना रहे हैं। और हो सकता है -

1) इंटरफ़ेस
यह IAnimal है: हालांकि, एक बात मुझे विश्वास है कि आप गायब हो सकता है कि आप वस्तुओं के 3 विभिन्न प्रकार यहाँ की जरूरत है (से "कम से कम परिभाषित" "सबसे परिभाषित करने के लिए") है किसी भी जानवर द्वारा कार्य किया जा सकता है जो

2) सार बेस क्लास यह पशु कैल्स है - जो कुछ भी पशु है, उसे पशु से प्राप्त करना चाहिए, लेकिन ये सीधे रचनात्मक नहीं हैं।यदि आप नाटक करते हैं कि आप ईश्वर हैं, तो आप एक कुत्ता, बिल्ली, गिलहरी, या फ़ज़ी बनी

3) पशु का कंक्रीट कार्यान्वयन ये वास्तविक वर्ग हैं। यह वही है जो आप बनाते हैं। आपके मामले में कुत्ते या बिल्ली।

यह चाल यह है कि आप केवल ठोस कक्षाएं बना सकते हैं, लेकिन आप किसी भी जानवर के साथ छेड़छाड़ करने और काम करने के लिए IAnimal या Animal (इंटरफेस या सार आधार वर्ग) का उपयोग कर सकते हैं (या, इंटरफेस के मामले में, ऐसा कुछ भी जो काम करता है एक जानवर)

+0

पूरी तरह से जवाब के लिए बहुत बहुत धन्यवाद। मुझे पॉइंटर्स चाहिए, जवाब नहीं। मैं बस उलझन में हूं, इसलिए इस तरह की मदद मुझे छोड़ने के बजाए बहुत तेज करेगी! दोपहर का भोजन आने वाला समय और मैं सभी उत्तरों को पढ़ रहा हूं और आज खत्म होने के लिए अपने प्रोजेक्ट के माध्यम से काम कर रहा हूं। वास्तव में मदद की सराहना करें – SheldonH

+0

मैंने जो पोस्ट किया है उसे दोबारा पढ़ें, और अपने कुत्ते और बिल्ली वर्गों पर नज़र डालें - एक ही संपत्ति पर "अमूर्त" का कोई भी उपयोग वर्ग को एक सार वर्ग बनाता है, इसलिए आप कुत्ते और बिल्ली को मेरी श्रेणी के लिए मजबूर कर रहे हैं 2. सी # में "ओवरराइड" कीवर्ड पर नज़र डालें - इससे आपको थोड़ा और मदद मिल सकती है। –

1
  1. एक इंटरफेस एक अनुबंध है। यह वह स्थान है जहां आप प्रदान की गई कार्यक्षमताओं का वर्णन करना चाहते हैं, बिना किसी कार्यान्वयन के विवरण

  2. एक सार वर्ग एक वर्ग है जिसका उद्देश्य अपने उप-वर्गों के बीच कार्यान्वयन विवरण साझा करना है। चूंकि यह केवल कोड साझाकरण/कारक उद्देश्यों के लिए है, इसे तत्काल नहीं किया जा सकता है

  3. आपकी वास्तविक कक्षा आपके अमूर्त वर्ग से प्राप्त होगी, और आवश्यक होने पर अमूर्त वर्ग में साझा कोड का उपयोग करते समय अपनी कक्षा-विशिष्ट कार्यक्षमताओं को लागू करेगी।

0

असल में, एक इंटरफेस एक 'अनुबंध' (यानी संचालन/गुणों का एक सेट) परिभाषित करता है जो सभी कार्यान्वयनकर्ताओं को प्रदान करना चाहिए। इस मामले में IAnimal इंटरफ़ेस को WhatAmI और WhatIsMyName गुणों की आवश्यकता होती है। सार वर्ग कुछ कार्यक्षमता प्रदान कर सकते हैं, फिर भी कुछ परिचालन छोड़ देंगे जो उनके उप-वर्गों द्वारा लागू किए जाने चाहिए।

आपके उदाहरण के मामले में, पशु बेस क्लास व्हाटआईएस नामकरण कार्यक्षमता प्रदान करने में सक्षम है क्योंकि 'नाम' सभी जानवरों की एक संपत्ति है। हालांकि, यह 'व्हाटएएमआई' संपत्ति प्रदान नहीं कर सकता है, क्योंकि केवल विशिष्ट उप-वर्गों को पता है कि वे किस प्रकार हैं।

नमूना कोड आप पोस्ट के साथ समस्या यह है कि thet पशु वर्ग इसके बारे में ज्ञान उपवर्गों है, जो यह

+0

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

+0

अच्छा बिंदु ... हालांकि मैं दुर्व्यवहार की प्रतिलिपि बनाने और चिपकाने वाला नहीं हूं, इसलिए यह कोई मुद्दा नहीं होना चाहिए। मुझे लगता है कि मुझे शायद थोड़ी मदद मिल गई है। मैं जो कुछ भी प्राप्त कर सकता हूं वह ले जाऊंगा, मैंने लगभग 2 सप्ताह बिताए हैं जो समझ में नहीं आये हैं। – SheldonH

0

एक और सुझाव है नहीं करना चाहिए गया है - (थोड़ा विषय बंद, लेकिन अभी भी संबंधित)

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

उदाहरण के लिए, कर के बजाय:

class SomeClass 
{ 
    public string MyProperty 
    { 
     get; 
     set; 
    } 
} 

कोशिश यह अपने आप को लागू करने:

class SomeClass 
{ 
    public string MyProperty 
    { 
     get 
     { 
      return "MyValue"; // Probably a private field 
     } 
     set 
     { 
      // myField = value; or something like that 
     } 
} 

मैं यह उल्लेख है क्योंकि यह इस विशेष मामले में मदद मिलेगी। चूंकि आप स्वचालित गुणों का उपयोग कर रहे हैं, इसलिए संकलक आपके लिए "रिक्त स्थान भरना" है, और आपके मामले में, मुझे लगता है कि यह आपको कुछ उपयोगी कंपाइलर त्रुटियों से रोकने से रोक रहा है। यह समझने की कोशिश करते समय कि ये अवधारणाएं कैसे काम करती हैं, काम करने से आमतौर पर यह आसान हो जाता है, कठिन नहीं होता है।

1

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

इंटरफेस अमूर्त कार्यान्वयन और इसलिए अमूर्त कक्षाएं करते हैं। कोई "बनाम" नहीं है क्योंकि आप एक सारणी वर्ग बना सकते हैं जो एक इंटरफ़ेस भी लागू करता है। तो ऐसा मत सोचो कि वे एक-दूसरे के साथ युद्ध में हैं।

इसलिए जब भी आप उपभोक्ता को कार्यान्वयन के बारे में बहुत कुछ नहीं जानना चाहते हैं तो किसी का भी उपयोग किया जा सकता है।इस नौकरी पर एक इंटरफ़ेस थोड़ा बेहतर है क्योंकि इसमें कोई कार्यान्वयन नहीं है, यह केवल यह बताता है कि उपभोक्ता उन मूल्यों को दबा सकता है जो वे वापस प्राप्त करते हैं और भेजते हैं कि एक अमूर्त वर्ग इस से थोड़ा अधिक कह सकता है (या यहां तक ​​कि बहुत कुछ!) । तो अगर आप इस बिंदु को ऑनबोर्ड पर लेते हैं तो आपको केवल इंटरफ़ेस की आवश्यकता होती है। Ergo, बिंदु दो:

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

सरल उदाहरण IDataStore है। सेविंगटोटाक्स्टफाइल डेटास्टोर सिर्फ एक वर्ग है जो आईडीटास्टोर लागू करता है। हालांकि MsSqlDataStore और MySQLDataStore सामान्य कोड साझा करेंगे। वे दोनों अमूर्त वर्ग SqlDataStore से उत्तराधिकारी होंगे जो IDataStore लागू करता है।

2

सामान्यतया:

  • एक इंटरफेस तरीकों एक वस्तु का जवाब देंगे वर्णन करते हैं। यह एक अनुबंध है जो वस्तु संतुष्ट करने के लिए प्रतिबद्ध है।

  • सार कक्षाएं बुनियादी कार्यक्षमता का वर्णन करती हैं और विशेष कार्यक्षमता को उप-वर्ग में जाने देती हैं।

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

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

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

आप हो सकता है:

  • पशु

  • परिवहन

  • कंप्यूटर गैजेट।

  • जो भी हो।

    public interface IIdentifiable 
    { 
    
         public long GetUniqueId(); 
    } 
    

    और सभी वर्गों है कि इस अनुबंध है कि इंटरफ़ेस को लागू करेगा संतुष्ट करना चाहते हैं:

क्योंकि वे असंबंधित विषय हैं, तो आप को लागू करने और इंटरफेस, मान लें करने के लिए चुन सकते हैं।

public class IPod: IIdentifiable 
{ 
     public long GetUniqueId() 
     { 
      return this.serialNum + this.otherId; 
     } 
} 

public class Cat: IIdentifiable 
{ 
     public long GetUniqueId() 
     { 
      return this..... 
     } 
} 

दोनों, और आइपॉड और एक बिल्ली, बहुत अलग प्रकृति है, लेकिन वे दोनों "GetUniqueId()" विधि, कि सूची प्रणाली में इस्तेमाल किया जाएगा करने के लिए जवाब हो सकता है।

तो यह इस तरह इस्तेमाल किया जा सकता है:

... 

    IIdentifiable ipod = new IPod(); 
    IIdentifiable gardfield = new Cat(); 

    store(ipod); 
    store(gardfield); 


    .... 
    public void store(IIdentifiable object) 
    { 

     long uniqueId = object.GetUniqueId(); 
     // save it to db or whatever. 
    } 

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

public abstract class Car 
    { 
     // Common attributes between different cars 
     private Tires[] tires; // 4 tires for most of them 
     private Wheel wheel; // 1 wheel for most of them. 

     // this may be different depending on the car implementation. 
     public abstract void move(); 
    } 


    class ElectricCar: Car 
    { 
     public void move() 
     { 
     startElectricEngine(); 
     connectBattery(); 
     deploySolarShields(); 
     trasnformEnertyToMovemetInWheels(); 
     } 
    } 

    class SteamCar: Car 
    {  
     public void move() 
     { 
      fillWithWather(); 
      boilWater(); 
      waitForCorrectTemperature(); 
      keepWaiting(); 
      releasePreasure.... 
     } 
    } 

यहाँ, कारों के दो प्रकार, लागू करता है अलग अलग तरीकों से "चाल" विधि, फिर भी वे आधार वर्ग में आम बातें साझा।

चीजों को और अधिक रोचक बनाने के लिए, ये दो कारें भी एक द्वितीयक इंटरफ़ेस को कार्यान्वित कर सकती हैं, लेकिन ऐसा करके, वे केवल GetUniqueId विधि का जवाब देने के लिए प्रतिबद्ध हैं, न कि कार होने की प्रकृति से। यही कारण है कि कार स्वयं स्वयं उस इंटरफ़ेस को लागू नहीं कर सकती है।

बेशक, यदि पहचान सामान्य गुणों पर आधारित हो सकती है तो कारों के पास हो सकता है, GetIdentifiableId बेस क्लास द्वारा कार्यान्वित किया जा सकता है और उप-वर्ग उस विधि का वारिस करेंगे।

// मामले 1 ... प्रत्येक उपवर्ग इंटरफ़ेस

public class ElectricCar: Car, IIdentifiable 
    { 
     public void move() 
     { 
     ..... 
     } 
     public long GetUniqueId() 
     { 
     .... 
     } 
    } 

    public class SteamCar: Car, IIdentifiable 
    { 
     public void move() 
     { 
     ..... 
     } 
     public long GetUniqueId() 
     { 
     .... 
     } 
    } 

केस 2 को लागू करता है, आधार वर्ग इंटरफेस और इसे से उपवर्ग लाभ लागू करता है।

public abstract class Car: IIdentifiable 
    { 
     // common attributes here 
     ... 
     ... 
     ... 



     public abstract void move(); 
     public long GetUniqueId() 
     { 
      // compute the tires, wheel, and any other attribute 
      // and generate an unique id here. 
     } 
    } 

    public class ElectricCar: Car 
    { 
     public void move() 
     { 
     ..... 
     } 
    } 

    public class SteamCar: Car 
    { 
     public void move() 
     { 
     ..... 
     } 
    } 

मुझे उम्मीद है कि इससे मदद मिलती है।

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

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