2011-09-06 20 views
12

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

सी # का उपयोग करके इसे और स्पष्ट कर देगा, क्योंकि मैंने इसे पहले ही सीखा है।

पी.एस: ट्यूटर्स, किताबें हम मिल गया है मूल भाषा, (अरबी) में हैं

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

+28

दोस्तों, पोस्टर स्पष्ट रूप से एक देशी अंग्रेजी वक्ता नहीं है, और वह उसके दो अंग्रेजी शब्दों कि प्रोग्रामिंग में भारी उपयोग किया जाता है के बाद से अपने पाठ्यपुस्तकों अरबी में लिखे गए हैं के बीच अंतर को समझने में मदद करने के लिए हमें पूछ रहा है। चूंकि वह अंग्रेजी को अच्छी तरह से नहीं जानता है, इसलिए वह उम्मीद कर रहा है कि एक भाषा में एक कोड स्निपेट जिसे वह समझता है उसे अंग्रेजी में स्पष्टीकरण के कई पैराग्राफ पढ़ने के बिना उसे पकड़ने में मदद मिलेगी। उसे एक ब्रेक दें। – StriplingWarrior

+0

@ स्टिप नाइस थॉरी, लेकिन ओपी के पास अंग्रेजी भाषा का एक अच्छा कमान है: http://stackoverflow.com/questions/7325073/how-could-i-get-over-my-programming-problems। –

+1

@ चतुरता: आह, ठीक है। लोगों को संदेह का लाभ देने के लिए बहुत कुछ। – StriplingWarrior

उत्तर

21

की मेरी पसंदीदा क्रिया का उपयोग करते हैं और हम पाते हैं:

http://en.wikipedia.org/wiki/Polymorphism_%28computer_science%29

http://msdn.microsoft.com/en-us/library/ms173152%28v=vs.80%29.aspx

बहुरूपता और विरासत निर्णायक हैं, जरूरत होने वाली है-दीर्घस्थायी और मौलिक सी # करने के लिए अवधारणाओं और उन्मुख प्रोग्रामिंग वस्तु। कह रहे हैं कि आप सी # जानते हैं और यह नहीं जानते कि अंग्रेजी कैसे बोलें और वर्णमाला क्या है इसकी कोई अवधारणा नहीं है। कुचलने के लिए खेद है, लेकिन यह सच है।

ऊपर विकी लिंक से (यह मेरा नहीं है), यहाँ बहुरूपता का एक उदाहरण है (सी # परिवर्तित ...)

public class Animal 
{ 
    public virtual String talk() { return "Hi"; } 
    public string sing() { return "lalala"; } 
} 

public class Cat : Animal 
{ 
    public override String talk() { return "Meow!"; } 
} 

public class Dog : Animal 
{ 
    public override String talk() { return "Woof!"; } 
    public new string sing() { return "woofa woofa woooof"; } 
} 

public class CSharpExampleTestBecauseYouAskedForIt 
{ 
    public CSharpExampleTestBecauseYouAskedForIt() 
    { 
     write(new Cat()); 
     write(new Dog()); 
    } 

    public void write(Animal a) { 
     System.Diagnostics.Debug.WriteLine(a.talk()); 
    } 

} 
21

विरासत अर्थ है कि यदि आप किसी सार्वजनिक क्षेत्र के साथ एक कक्षा कार बनाने टैंकसाइज तो आप इसे कक्षा सुपरकार से प्राप्त करते हैं, आखिरी व्यक्ति ने कार से टैंकसाइज फ़ील्ड को विरासत में मिला है।

पॉलिमॉर्फिज्म यह तथ्य है कि कोड में हर बार आपके पास एक तरीका है जहां एक कार की उम्मीद है कि आप सुपरकार पास कर सकते हैं और यह कार की तरह व्यवहार करेगा।

आवश्यकतानुसार परिभाषित वर्चुअल विधियों के साथ आप बेस क्लास पर एक विधि कॉल करेंगे, लेकिन जिस वास्तविक वस्तु पर आप काम कर रहे हैं वह वर्चुअल विधि के अपने संस्करण को निष्पादित करेगा ताकि आप SuperCar.GetPrice को कॉल कर सकें और कार नहीं। वास्तव में GetPrice।

यह कुछ शब्दों में, अधिक के लिए, मुझे लगता है कि अन्य लोग पहले से ही लिख रहे हैं जैसे मैं लिख रहा हूं।

public class BaseClass 
    { 
     public string HelloMessage = "Hello, World!"; 
    } 

    public class SubClass : BaseClass 
    { 
     public string ArbitraryMessage = "Uh, Hi!"; 
    } 

    public class Test 
    { 
     static void Main() 
     { 
      SubClass subClass = new SubClass(); 

      // Inheritence 
      Console.WriteLine(subClass.HelloMessage); 
     } 
    } 
+4

सरल शब्द कभी-कभी व्याख्यान से अधिक का मतलब है, आपके दिमाग की स्पष्टता साझा करने के लिए धन्यवाद। – Obzajd

+0

आपका दूसरा पैराग्राफ गलत है, मुझे विश्वास है। आपको कार और सुपरकार को चारों ओर स्विच करने की ज़रूरत है - हर बार जब आपको माता-पिता (कार) – Jonesopolis

+0

@ जॉनी में पास किया जा सकता है, तो मुझे यकीन है कि वह यहां सामान्य विश्व अर्थशास्त्र का उपयोग कर रहा है, _SuperCar_ एक बेहतर, बढ़ी हुई कार है। प्रोग्रामर अर्थशास्त्र का उपयोग करते समय एक _SubCar_ होगा। – Alex

37

इस बहुरूपता है। विरासत क्लास बेस क्लास की कार्यक्षमता का उपयोग करने का तरीका है। पॉलिमॉर्फिज्म बेस क्लास व्युत्पन्न वर्ग के कार्यान्वयन का उपयोग करने का तरीका है।

public class Triangle :Shape { 
public int getSides() { 
    return 3; 
} 
} 

} 
public class Shape { 
public boolean isSharp(){ 
    return true; 
} 
public virtual int getSides(){ 
    return 0 ; 
} 

public static void main() { 
    Triangle tri = new Triangle(); 
    System.Console.WriteLine("Triangle is a type of sharp? " + tri.isSharp()); //Inheritance 
    Shape shape = new Triangle(); 
    System.Console.WriteLine("My shape has " + shape.getSides() + " sides."); //Polymorphism 
} 
} 
8

के एक और अधिक दिलचस्प तरीके से इस बारे में बताएं:

public interface Animal 
{ 
    string Name { get; } 
} 

public class Dog : Animal 
{ 
    public string Name { get { return "Dog"; } } 
} 

public class Cat : Animal 
{ 
    public string Name { get { return "Cat"; } } 
} 

public class Test 
{ 
    static void Main() 
    { 
     // Polymorphism 
     Animal animal = new Dog(); 

     Animal animalTwo = new Cat(); 

     Console.WriteLine(animal.Name); 
     Console.WriteLine(animalTwo.Name); 
    } 
} 

इस विरासत है:

+0

अब आपने कहा था कि, किसी भी तरह से सीखने और मेरे दैनिक प्रोग्रामिंग में उपयोग करने के लिए दिलचस्प विषय मिला है, इससे पहले कि इससे पहले कि इससे बचें। – Obzajd

6

विरासत और बहुरूपता के बीच कोई अंतर नहीं है। पॉलिमॉर्फिज्म विरासत का एक हिस्सा है और यह इसके बिना अस्तित्व में नहीं हो सकता है। संक्षेप में, बहुरूपता बेस क्लास के ऑब्जेक्ट के रूप में ऑब्जेक्ट का इलाज करने की क्षमता है, लेकिन बेस क्लास पर वर्ट्यूल विधि को कॉल करना बाल वर्ग से अनुचित विधि का आह्वान करेगा।अच्छा उदाहरण यहां है: http://www.psworld.pl/Programming/Inheritance

6

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

संदर्भ: http://www.codeproject.com/Articles/1445/Introduction-to-inheritance-polymorphism-in-C

+0

वह अंतिम वाक्य बहुत उपयोगी था –

3

बहुरूपता अधिभावी आप क्या विरासत में प्राप्त का कार्य है।

यदि आप इसे ओवरराइड नहीं करते हैं, तो यह बहुरूपता नहीं है, यह केवल विरासत है।

+1

जब तक कि आप इंटरफेस का उपयोग नहीं कर रहे हों। फिर आप इंटरफेस के माध्यम से पॉलिमॉर्फिक व्यवहार को कार्यान्वित कर रहे हैं। –

1

यह लगभग व्यवहार है।

एक वर्ग एक निश्चित व्यवहार (इंटरफ़ेस या अनुबंध) वाणी:

यही वर्ग भी अपने उपवर्गों में से किसी को उस व्यवहार (कार्यान्वयन) या प्रतिनिधि या तो पूरा या इसका हिस्सा परिभाषित कर सकते हैं:

में स्यूडोकोड:

class Animal { 
    method walk() 
    method speak() 
    method jump() 
    // ... here goes the implementation of the methods 
} 

आप उपवर्गीकरण के माध्यम से एक वर्ग इनहेरिट अन्य वर्ग के व्यवहार करते हैं।

एक विधि के क्रियान्वयन उपवर्गों को प्रत्यायोजित किया जाता है, विधि सार आधार वर्ग में कहा जाता है और जावा जैसी भाषाओं में, पूरे आधार वर्ग सार रूप में अच्छी तरह हो जाता है:

abstract class Animal { 
    method walk() { 
     doWalk() 
    } 
    method speak() { 
     print "hi, I am an animal!" 
    } 
    abstract method jump() // delegated to specific animals 
} 

class Horse inherits from Animal { 
    override method walk() { 
     doWalkLikeAHorse() 
    } 
    override method speak() { 
     print "hi, I am a horse!" 
    } 
    override method jump() { 
     doJumpLikeAHorse() 
    } 
} 

class Elephant inherits from Animal { 
    override method walk() { 
     doWalkLikeAnElephant() 
    } 
    override method speak() { 
     print "hi, I am an elephant!" 
    } 
    override method jump() { 
     throw error "Sorry, I can't jump!!" 
    } 
} 

एक कक्षा 'व्यवहार डिफ़ॉल्ट रूप से वर्चुअल है, जिसका अर्थ है कि किसी भी वर्ग विधियों को किसी उप-वर्ग द्वारा ओवरराइड किया जा सकता है। इस प्रकार यह सी # और जावा जैसी भाषाओं में काम करता है, लेकिन उदाहरण के लिए, सी ++ में जरूरी नहीं है।

पदार्थ में, एक आधार वर्ग के व्यवहार केवल आभासी है और जब उपवर्गों कि आभासी व्यवहार को ओवरराइड "कई" (पाली) "अलग अलग रूपों" (morphs) मान सकते हैं। यही कारण है कि इसे पॉलिमॉर्फिज्म कहा जाता है। छद्म कोड में:

function makeAnimalSpeak(Animal animal) { 
    animal.speak(); 
} 

makeAnimalSpeak(new Elephant()) // output: "hi, I am an elephant" 
makeAnimalSpeak(new Horse()) // output: "hi, I am a horse" 

अन्य लोगों ने आपको यहां बेहतर उदाहरण दिए हैं।

सी # और जावा जैसी भाषाओं में आपके पास इंटरफ़ेस (जो सी ++ में मौजूद नहीं है) का विचार है, जो केवल व्यवहार की घोषणा है। एक वर्ग के विपरीत, एक इंटरफ़ेस का व्यवहार लागू करने का कोई दायित्व नहीं है। यह सिर्फ एक घोषणा है। कोई भी वर्ग उस व्यवहार को लागू कर सकता है, चाहे वह किस आधार वर्ग से प्राप्त हो।स्यूडोकोड में:

interface FlyingBeing { 
    method fly() 
} 

class FlyingPig inherits from Animal implements FlyingBeing { 
    method fly() { 
     print "hey, look at me, I am a flying pig!!" 
    } 
} 
संबंधित मुद्दे