สำรวจวิธีการเสมือนและนามธรรมใน C #

ภาษาการเขียนโปรแกรม C # ให้การสนับสนุนทั้งวิธีเสมือนและนามธรรมซึ่งแต่ละวิธีมีข้อดีที่แตกต่างกัน คุณใช้เมธอดเสมือนเพื่อใช้การโยงล่าช้าในขณะที่เมธอดนามธรรมช่วยให้คุณบังคับคลาสย่อยของประเภทให้มีการลบล้างเมธอดอย่างชัดเจน ในโพสต์นี้ฉันจะนำเสนอการอภิปรายเกี่ยวกับวิธีการเสมือนและนามธรรมและเวลาที่ควรใช้

วิธีการเสมือนคือวิธีที่ถูกประกาศให้เป็นเสมือนในคลาสพื้นฐาน มีการประกาศเมธอดเป็นเสมือนโดยระบุคีย์เวิร์ด "virtual" ในลายเซ็นวิธี วิธีการเสมือนอาจมีหรือไม่มีชนิดส่งคืน วิธีการเสมือนอนุญาตให้คลาสย่อยของชนิดสามารถแทนที่เมธอดได้ พวกเขาใช้เพื่อใช้ความหลากหลายของเวลาทำงานหรือการเชื่อมโยงล่าช้า ควรสังเกตว่าสมาชิกเสมือนหรือนามธรรมของชั้นเรียนไม่สามารถประกาศเป็นส่วนตัวได้ นอกจากนี้คุณสามารถมีการนำไปใช้งานในวิธีเสมือนเช่นวิธีการเสมือนจริงสามารถมีการใช้งานได้ การนำไปใช้งานเหล่านี้สามารถถูกแทนที่ได้โดยคลาสย่อยของประเภทที่กำหนดวิธีการเสมือน

สถานะ MSDN: "คีย์เวิร์ดเสมือนถูกใช้เพื่อแก้ไขวิธีการคุณสมบัติตัวทำดัชนีหรือการประกาศเหตุการณ์และอนุญาตให้ลบล้างในคลาสที่ได้รับ"

ตอนนี้เรามาดูโค้ดกันดีกว่าเพื่อความชัดเจนในการใช้วิธีการเสมือนจริง อ้างอิงข้อมูลโค้ดด้านล่าง

public class Base

{

public virtual void Test()

{

Console.WriteLine("This is the base version of the virtual method");

}

}

public class Derived : Base

{

public override void Test()

{

Console.WriteLine("This is the derived version of the virtual method");

}

}

เมธอด Test () ถูกประกาศเป็นเสมือนในคลาส Base และถูกแทนที่ในคลาส Derived สังเกตวิธีใช้คีย์เวิร์ดเสมือนเพื่อประกาศเมธอดเสมือนในคลาส Base ไม่จำเป็นต้องใช้คีย์เวิร์ดเสมือนเมื่อคุณแทนที่เมธอดเสมือนในคลาส Derived

ตอนนี้อ้างถึงข้อมูลโค้ดที่ระบุถัดไปซึ่งแสดงให้เห็นว่าวิธีการเสมือนถูกเรียกใช้อย่างไร

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

โปรดสังเกตว่าสองอินสแตนซ์ของคลาสฐานถูกสร้างขึ้น - baseObj1 และ baseObj2 ในกรณีแรกอ็อบเจ็กต์อ้างอิงชื่อ baseObj1 อ้างถึงอินสแตนซ์ของคลาส Base ในกรณีที่สองอ็อบเจ็กต์อ้างอิงชื่อ baseObj2 หมายถึงอินสแตนซ์ของคลาส Derived เมื่อคุณรันโค้ดการเรียกใช้เมธอดเสมือนครั้งแรกจะแสดงข้อความ "นี่คือเวอร์ชันพื้นฐานของเมธอดเสมือน" ในคอนโซล ในกรณีที่สองข้อความ "นี่คือเวอร์ชันที่ได้รับมาของวิธีการเสมือน" จะปรากฏขึ้น ทำไมถึงแตกต่างกัน?

ในกรณีแรกประเภทของอ็อบเจ็กต์อ้างอิง baseObj1 จะถูกพิจารณา - เนื่องจากเป็นประเภทฐานเวอร์ชันพื้นฐานของวิธีการเสมือนจะถูกเรียกใช้ ในกรณีที่สองบริบทของวัตถุอ้างอิง baseObj2 จะได้รับการพิจารณาและด้วยเหตุนี้ผลลัพธ์

วิธีนามธรรมคือวิธีการที่ประกาศเป็นนามธรรมในคลาสพื้นฐานและไม่สามารถนำไปใช้งานได้กล่าวคือไม่สามารถมีฟังก์ชันใด ๆ ในนั้นได้ คุณสามารถใช้วิธีนามธรรมเมื่อคุณต้องการให้เมธอดถูกลบล้างอย่างมีประสิทธิภาพในคลาสที่ได้รับมาของประเภทที่กำหนดวิธีนามธรรมไว้ สิ่งนี้บังคับใช้ในเวลาคอมไพล์โดยคอมไพเลอร์ ดังนั้นหากคุณประกาศวิธีการเป็นนามธรรมโดยใช้ตัวปรับเปลี่ยนนามธรรมในคลาสพื้นฐานคลาสย่อยของคลาสนี้จะต้องใช้วิธีนามธรรมที่ล้มเหลวซึ่งคอมไพเลอร์จะแสดงข้อผิดพลาดที่ระบุว่าคลาสที่ได้รับไม่ได้ใช้บทคัดย่อ สมาชิก. ในสาระสำคัญ,วิธีการนามธรรมถูกประกาศโดยใช้คำสำคัญนามธรรมในคลาสฐานนามธรรมและคลาสย่อยที่ไม่ใช่นามธรรมประเภทนี้จะต้องมีการนำวิธีนามธรรมมาใช้เอง วิธีนามธรรมยังมีลักษณะเสมือนโดยปริยาย แต่คุณไม่สามารถใช้คำสำคัญเสมือนเมื่อประกาศวิธีนามธรรมได้ ควรสังเกตว่าวิธีการนามธรรมสามารถประกาศได้เฉพาะในคลาสนามธรรมเท่านั้น

การใช้วิธีนามธรรมโดยทั่วไปคือการบังคับให้แทนที่เมธอด ToString () หรือ Equals () ข้อมูลโค้ดต่อไปนี้แสดงให้เห็นว่ามีการประกาศวิธีการนามธรรมในคลาสนามธรรมที่ชื่อ EntityBase อย่างไร

public abstract class EntityBase

{

public abstract override string ToString();

public abstract override bool Equals(object obj);

}

public class Customer : EntityBase

{

//Implementation code for the abstract methods

}

คลาส EntityBase เป็นประเภทพื้นฐานสำหรับเอนทิตีทั้งหมด - คลาสเอนทิตีลูกค้าขยายคลาสนี้และจัดเตรียมการนำไปใช้สำหรับเมธอดนามธรรม โดยพื้นฐานแล้วคลาสเอนทิตีทั้งหมดจะจัดเตรียมวิธีการใช้งาน ToString () และ Equals () ของตนเอง ไม่จำเป็นต้องใช้การเริ่มต้นสำหรับวิธีการเหล่านี้ในคลาสพื้นฐานและด้วยเหตุนี้จึงถูกทำเครื่องหมายเป็นนามธรรม ดังนั้นวิธีการแทนที่ถูกบังคับใช้โดยการประกาศเมธอดเป็นนามธรรมในคลาสฐานชื่อ EntityBase