พหุรูปแบบและการเรียกแบบพลวัต
ทำความเข้าใจพหุรูปแบบ: เรียกสมาชิก virtual ผ่านการอ้างอิงชนิดฐาน ใช้คอลเลกชันที่มีชนิดฐาน หลีกเลี่ยงการซ่อนเมธอด และแคสต์อย่างปลอดภัยเมื่อจำเป็น
พหุรูปแบบและการเรียกแบบพลวัต เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 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
}
}
}
การซ่อนเทียบกับการแทนที่
หลีกเลี่ยงการซ่อนเมธอดด้วย new ใช้ overrideสำหรับพหุรูปแบบที่แท้จริง การซ่อนจะเรียกใช้เวอร์ชันของคลาสฐานเมื่ออ้างอิงผ่านคลาสฐาน
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 เป็นอันดับแรก
- ใช้ override ไม่ใช่ new เพื่อเปลี่ยนพฤติกรรม
- ทำให้ APIs ของคลาสฐานมีขนาดเล็กและคงที่
- แปลงชนิดข้อมูลให้น้อยครั้ง ควรเลือกใช้พหุรูปแบบหรืออินเทอร์เฟซ
ความหมายของการเลือกเมธอดแบบไดนามิก
ทบทวน
ทบทวน: พหุรูปแบบทำให้การเรียกผ่านคลาสฐานหนึ่งครั้งเข้าถึงพฤติกรรมของคลาสที่สืบทอดได้หลายแบบผ่าน virtual/override ใช้คอลเลกชันที่มีชนิดข้อมูลฐาน หลีกเลี่ยงการซ่อนด้วย new และแปลงชนิดข้อมูลเฉพาะเมื่อจำเป็น
คำถามที่พบบ่อย
บทเรียน “พหุรูปแบบและการเรียกแบบพลวัต” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พหุรูปแบบและการเรียกแบบพลวัต” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พหุรูปแบบและการเรียกแบบพลวัต”
ทำความเข้าใจพหุรูปแบบ: เรียกสมาชิก virtual ผ่านการอ้างอิงชนิดฐาน ใช้คอลเลกชันที่มีชนิดฐาน หลีกเลี่ยงการซ่อนเมธอด และแคสต์อย่างปลอดภัยเมื่อจำเป็น คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน
บทเรียน “พหุรูปแบบและการเรียกแบบพลวัต” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม
ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- virtual/override/sealed และคลาสนามธรรม
- อินเทอร์เฟซ (บทนำ) และการใช้งานหลายอินเทอร์เฟซ
- พหุรูปแบบและการเรียกแบบพลวัต