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

virtual/override/sealed และคลาสนามธรรม

เรียนรู้เมธอด virtual การเขียนทับ การปิดผนึกการเขียนทับ และคลาสนามธรรม ดูว่าการอ้างอิงชนิดฐานเรียกใช้การทำงานของชนิดสืบทอดอย่างไร

virtual/override/sealed และคลาสนามธรรม เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

พื้นฐานการสืบทอด

เป้าหมาย: ใช้พฤติกรรมซ้ำและปรับแต่งพฤติกรรมผ่านการสืบทอด

  • virtual ในคลาสฐาน
  • override ในคลาสที่สืบทอด
  • sealed override เพื่อหยุดการเปลี่ยนแปลงเพิ่มเติม
  • abstract คลาสกำหนดสัญญาและโค้ดที่ใช้ร่วมกัน

virtual และ override

virtualเปิดให้แทนที่การทำงานได้ การเรียกผ่าน reference ของคลาสฐานจะใช้ override ของคลาสที่สืบทอดด้วยการเลือกเมธอดแบบไดนามิก

using System;

// Base method is virtual so derived classes can customize it
public class Shape
{
  public virtual double Area()
  {
    return 0.0; // default
  }
}

public class Rectangle : Shape
{
  public int Width { get; private set; }
  public int Height { get; private set; }

  public Rectangle(int w, int h)
  {
    Width = w; Height = h;
  }

  public override double Area()
  {
    return Width * Height;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    Shape s = new Shape();
    Shape r = new Rectangle(3, 4); // base reference
    Console.WriteLine("Shape area = " + s.Area());
    Console.WriteLine("Rectangle area = " + r.Area()); // calls Rectangle.Area()
  }
}

sealed override

ใช้ sealed overrideเพื่อล็อกเมธอดไว้ที่ระดับหนึ่งในลำดับชั้นการสืบทอด

using System;

public class BaseLogger
{
  public virtual string Prefix()
  {
    return "[LOG]";
  }
}

public class ConsoleLogger : BaseLogger
{
  public sealed override string Prefix()
  {
    return "[CONSOLE]";
  }
}

// Further derived class cannot override Prefix again:
// public class FancyLogger : ConsoleLogger
// {
//   public override string Prefix() { return "[FANCY]"; } // compile error
// }

public class Program
{
  public static void Main(string[] args)
  {
    ConsoleLogger log = new ConsoleLogger();
    Console.WriteLine(log.Prefix() + " Ready");
  }
}

คลาสแบบ abstract

คลาสแบบ abstractกำหนดสมาชิกที่จำเป็นต้องมี และยังสามารถจัดเตรียมโค้ดที่ใช้ร่วมกันได้

using System;

// Abstract class: cannot be instantiated; must implement abstract members
public abstract class Animal
{
  public abstract string Speak(); // no body here
  public string Info()
  {
    return "Animal says: " + Speak(); // shared code uses the abstract member
  }
}

public class Dog : Animal
{
  public override string Speak()
  {
    return "Woof";
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    // Animal a = new Animal(); // compile error: abstract
    Animal d = new Dog();
    Console.WriteLine(d.Info()); // calls Dog.Speak()
  }
}

virtual เทียบกับ abstract

เลือกใช้:

  • virtual: จัดเตรียมเนื้อหาเริ่มต้นที่ชนิดข้อมูลที่สืบทอดอาจแทนที่ได้
  • abstract: ไม่มีเนื้อหา ชนิดข้อมูลที่สืบทอดต้องนำไปใช้งาน
  • sealed override: หยุดการแทนที่เพิ่มเติมเมื่อกำหนดพฤติกรรมเรียบร้อยแล้ว

การเรียกใช้แบบพหุรูปแบบ

พหุรูปแบบคือการที่เมธอดรับชนิดข้อมูลฐาน และเรียกสมาชิกที่ถูกแทนที่บนอินสแตนซ์ของชนิดข้อมูลที่สืบทอด

using System;

public class Notifier
{
  public virtual string Channel() { return "Base"; }
}

public class EmailNotifier : Notifier
{
  public override string Channel() { return "Email"; }
}

public class SmsNotifier : Notifier
{
  public override string Channel() { return "SMS"; }
}

public class Program
{
  // Works with any Notifier (polymorphism)
  static void Send(Notifier n, string msg)
  {
    Console.WriteLine("[" + n.Channel() + "] " + msg);
  }

  public static void Main(string[] args)
  {
    Send(new EmailNotifier(), "Hello");
    Send(new SmsNotifier(), "Hi");
  }
}

กฎของ virtual/override/sealed

ตรวจสอบความเข้าใจอย่างรวดเร็ว: ข้อความใดเกี่ยวกับ virtual, override และ sealed ใน C# ถูกต้อง

ทบทวน

ทบทวน: กำหนดเมธอดในคลาสฐานเป็น virtual ใช้ override ในชนิดข้อมูลที่สืบทอด และใช้ sealed overrideเพื่อล็อกพฤติกรรม ใช้ คลาสแบบ abstractเพื่อบังคับให้มีการนำไปใช้งาน พร้อมแบ่งปันโค้ดทั่วไป

คำถามที่พบบ่อย

บทเรียน “virtual/override/sealed และคลาสนามธรรม” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “virtual/override/sealed และคลาสนามธรรม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “virtual/override/sealed และคลาสนามธรรม”

เรียนรู้เมธอด virtual การเขียนทับ การปิดผนึกการเขียนทับ และคลาสนามธรรม ดูว่าการอ้างอิงชนิดฐานเรียกใช้การทำงานของชนิดสืบทอดอย่างไร คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน

บทเรียน “virtual/override/sealed และคลาสนามธรรม” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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