Polymorphism और dynamic dispatch
polymorphism समझिए: base reference के माध्यम से virtual members को कॉल कीजिए, base-typed collections का उपयोग कीजिए, method hiding से बचिए और आवश्यकता होने पर सुरक्षित casting कीजिए।
Polymorphism और dynamic dispatch, CoddyKit पर C# अकादमी का एक निःशुल्क पाठ है। यह 3 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह C# अकादमी सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C# अकादमी पाठ्यक्रम में कुल 3 पाठ शामिल हैं।
बहुरूपता का अवलोकन
लक्ष्य: एक आधार प्रकार का उपयोग करें और व्युत्पन्न प्रकारों को व्यवहार अनुकूलित करने दें।
- आधार reference, व्युत्पन्न ऑब्जेक्ट
- virtual + override → डायनेमिक डिस्पैच
- आधार-प्रकार वाले संग्रह
- new विधि छिपाने से बचें
डायनेमिक डिस्पैच की मूल बातें
virtual विधि को कॉल करने पर चर के कंपाइल-टाइम प्रकार के बजाय ऑब्जेक्ट के रनटाइम प्रकार का उपयोग होता है।
using System;
public class Animal
{
public virtual string Speak() { return "???"; }
}
public class Cat : Animal
{
public override string Speak() { return "Meow"; }
}
public class Dog : Animal
{
public override string Speak() { return "Woof"; }
}
public class Program
{
public static void Main(string[] args)
{
Animal a1 = new Cat(); // base reference
Animal a2 = new Dog();
Console.WriteLine(a1.Speak()); // Meow
Console.WriteLine(a2.Speak()); // Woof
}
}
संग्रहों में बहुरूपता
अलग-अलग व्युत्पन्न प्रकारों को List<Base> में रखें और virtual सदस्यों को एक समान तरीके से कॉल करें।
using System;
using System.Collections.Generic;
public class Shape
{
public virtual double Area() { return 0.0; }
}
public class Rectangle : Shape
{
private readonly int _w, _h;
public Rectangle(int w, int h) { _w = w; _h = h; }
public override double Area() { return _w * _h; }
}
public class Circle : Shape
{
private readonly int _r;
public Circle(int r) { _r = r; }
public override double Area() { return 3.14159 * _r * _r; }
}
public class Program
{
public static void Main(string[] args)
{
List<Shape> shapes = new List<Shape>();
shapes.Add(new Rectangle(3, 4));
shapes.Add(new Circle(2));
foreach (Shape s in shapes)
{
Console.WriteLine("Area = " + s.Area()); // calls correct override
}
}
}
छिपाना बनाम override
विधि छिपाने (new) से बचें। वास्तविक बहुरूपता के लिए override का उपयोग करें; छिपाने पर आधार reference के ज़रिए आधार संस्करण को कॉल किया जाता है।
using System;
public class Printer
{
public virtual void Print() { Console.WriteLine("[Base]"); }
}
public class LoudPrinter : Printer
{
public override void Print() { Console.WriteLine("[LOUD]"); }
}
public class HiddenPrinter : Printer
{
// Hides the base method instead of overriding (BAD fit for polymorphism)
public new void Print() { Console.WriteLine("[HIDDEN]"); }
}
public class Program
{
public static void Main(string[] args)
{
Printer a = new LoudPrinter();
Printer b = new HiddenPrinter();
a.Print(); // [LOUD] (override works)
b.Print(); // [Base] (hiding fails via base reference)
}
}
सुरक्षित कास्टिंग (as और जाँच)
आधार/virtual कॉल को प्राथमिकता दें। यदि व्युत्पन्न प्रकार के विशेष सदस्यों का उपयोग करना आवश्यक हो, तो सुरक्षित रूप से कास्ट करें (as + null जाँच)।
using System;
public class Vehicle
{
public virtual string Info() { return "Vehicle"; }
}
public class Car : Vehicle
{
public bool HasAirConditioning;
public override string Info() { return "Car"; }
}
public class Program
{
public static void Main(string[] args)
{
Vehicle v = new Car();
Console.WriteLine(v.Info()); // polymorphic call
// Need a Car-only member? Cast carefully using 'as'
Car c = v as Car;
if (c != null)
{
c.HasAirConditioning = true;
Console.WriteLine("AC set: " + c.HasAirConditioning);
}
else
{
Console.WriteLine("Not a Car");
}
}
}
बहुरूपता के सुझाव
सुझाव:
- पहले आधार/virtual कॉल के लिए डिज़ाइन करें।
- व्यवहार बदलने के लिए new के बजाय override का उपयोग करें।
- आधार APIs को छोटा और स्थिर रखें।
- कम ही कास्ट करें; बहुरूपता या इंटरफ़ेस को प्राथमिकता दें।
डायनेमिक डिस्पैच का अर्थ
पुनरावृत्ति
पुनरावृत्ति: बहुरूपता एक आधार कॉल को virtual/override के ज़रिए कई व्युत्पन्न व्यवहारों तक पहुँचने देती है। आधार-प्रकार वाले संग्रहों का उपयोग करें, new द्वारा छिपाने से बचें और केवल आवश्यकता होने पर कास्ट करें।
एआई शिक्षक के साथ C# सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 93
- पाठ
- 346
अक्सर पूछे जाने वाले प्रश्न
क्या “Polymorphism और dynamic dispatch” पाठ निःशुल्क है?
हाँ—“Polymorphism और dynamic dispatch” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और C# अकादमी पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। C# अकादमी पाठ्यक्रम में कुल 3 पाठ शामिल हैं।
“Polymorphism और dynamic dispatch” में मैं क्या सीखूँगा?
polymorphism समझिए: base reference के माध्यम से virtual members को कॉल कीजिए, base-typed collections का उपयोग कीजिए, method hiding से बचिए और आवश्यकता होने पर सुरक्षित casting कीजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C# अकादमी का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C# अकादमी शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C# अकादमी शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 3 में से 3वाँ पाठ है।
“Polymorphism और dynamic dispatch” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C# अकादमी पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C# अकादमी पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- virtual/override/sealed; abstract classes
- Interfaces (परिचय) और कई interface लागू करना
- Polymorphism और dynamic dispatch