0Pricing
C# Academy · บทเรียน

พหุรูปแบบและการเรียกแบบพลวัต

ทำความเข้าใจพหุรูปแบบ: เรียกสมาชิก 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 ของคลาสฐานมีขนาดเล็กและคงที่
  • แปลงชนิดข้อมูลให้น้อยครั้ง ควรเลือกใช้พหุรูปแบบหรืออินเทอร์เฟซ

ความหมายของการเลือกเมธอดแบบไดนามิก

ตรวจสอบความเข้าใจอย่างรวดเร็ว: การเลือกเมธอดแบบไดนามิกใน C# หมายถึงอะไร

ทบทวน

ทบทวน: พหุรูปแบบทำให้การเรียกผ่านคลาสฐานหนึ่งครั้งเข้าถึงพฤติกรรมของคลาสที่สืบทอดได้หลายแบบผ่าน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. virtual/override/sealed และคลาสนามธรรม
  2. อินเทอร์เฟซ (บทนำ) และการใช้งานหลายอินเทอร์เฟซ
  3. พหุรูปแบบและการเรียกแบบพลวัต
← กลับไปที่ C# Academy