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 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- virtual/override/sealed และคลาสนามธรรม
- อินเทอร์เฟซ (บทนำ) และการใช้งานหลายอินเทอร์เฟซ
- พหุรูปแบบและการเรียกแบบพลวัต