Meneroka kaedah maya dan abstrak dalam C #

Bahasa pengaturcaraan C # memberikan sokongan untuk kedua-dua kaedah maya dan abstrak, yang masing-masing mempunyai kelebihan yang berbeza. Anda menggunakan kaedah maya untuk melaksanakan pengikatan lewat, sedangkan kaedah abstrak memungkinkan anda memaksa subkelas jenis tersebut agar kaedah tersebut diganti secara eksplisit. Dalam catatan ini, saya akan membincangkan perbincangan mengenai kaedah maya dan abstrak dan kapan kaedah tersebut harus digunakan.

Kaedah maya adalah kaedah yang dinyatakan sebagai maya di kelas asas. Kaedah dinyatakan sebagai maya dengan menentukan kata kunci "maya" dalam tandatangan kaedah. Kaedah maya mungkin atau tidak mempunyai jenis pengembalian. Kaedah maya membolehkan subkelas jenisnya mengatasi kaedah tersebut. Mereka digunakan untuk melaksanakan polimorfisme jangka masa atau pengikatan lewat. Perlu diingatkan bahawa ahli kelas maya atau abstrak tidak boleh dinyatakan sebagai peribadi. Anda juga dapat melaksanakannya dalam metode maya, iaitu, kaedah maya dapat memiliki implementasi di dalamnya. Pelaksanaan ini dapat diganti oleh subkelas dari jenis di mana kaedah maya telah ditentukan.

MSDN menyatakan: "Kata kunci maya digunakan untuk mengubah kaedah, harta tanah, pengindeks, atau perisytiharan peristiwa dan membiarkannya diganti dalam kelas turunan."

Sekarang mari kita menggali beberapa kod untuk kejelasan yang lebih baik mengenai kaedah maya digunakan. Rujuk coretan kod di bawah.

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");

}

}

Kaedah Uji () dinyatakan sebagai maya di kelas Asas dan diganti dalam kelas Derived. Perhatikan bagaimana kata kunci maya digunakan untuk menyatakan kaedah sebagai maya di kelas Asas. Kata kunci maya tidak diperlukan semasa anda mengatasi kaedah maya di kelas Derived.

Sekarang, rujuk coretan kod yang diberikan seterusnya yang menggambarkan bagaimana kaedah maya dipanggil.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Perhatikan bahawa dua contoh kelas Base dibuat - baseObj1 dan baseObj2. Dalam kes pertama, objek rujukan bernama baseObj1 merujuk kepada contoh kelas Base. Dalam kes kedua, objek rujukan bernama baseObj2 merujuk pada contoh kelas Turun. Semasa anda menjalankan kod, panggilan pertama ke kaedah maya akan memaparkan mesej "Ini adalah versi asas kaedah maya" di konsol. Dalam kes kedua, pesan "Ini adalah versi kaedah maya yang diturunkan" akan ditampilkan. Mengapa perbezaan ini?

Dalam kes pertama, jenis objek rujukan baseObj1 dipertimbangkan - kerana jenis Base, versi asas kaedah maya akan dipanggil. Dalam kes kedua, konteks dasar objek rujukanObj2 akan dipertimbangkan dan oleh itu hasilnya.

Kaedah abstrak adalah kaedah yang dinyatakan abstrak dalam kelas asas dan tidak dapat dilaksanakan di dalamnya, iaitu, mereka tidak boleh mempunyai fungsi di dalamnya. Anda boleh menggunakan kaedah abstrak apabila anda mahukan kaedah tersebut diganti secara paksa dalam kelas turutan jenis yang mana kaedah abstrak telah ditentukan. Ini dikuatkuasakan pada masa penyusunan oleh penyusun. Oleh itu, jika anda telah menyatakan kaedah sebagai abstrak menggunakan pengubah abstrak dalam kelas asas, subkelas kelas ini harus melaksanakan kaedah abstrak yang gagal yang mana penyusun akan menunjukkan ralat yang menyatakan bahawa kelas yang berasal tidak melaksanakan abstrak ahli. Pada asasnya,kaedah abstrak dinyatakan menggunakan kata kunci abstrak dalam kelas asas abstrak dan subkelas bukan abstrak jenis ini harus mempunyai pelaksanaan kaedah abstrak mereka sendiri. Kaedah abstrak juga secara tersirat maya tetapi anda tidak boleh menggunakan kata kunci maya ketika menyatakan kaedah abstrak. Harus diingat bahawa kaedah abstrak hanya dapat dinyatakan dalam kelas abstrak.

Penggunaan khas kaedah abstrak adalah untuk memaksa penggantian kaedah ToString () atau Equals (). Coretan kod berikut menggambarkan bagaimana kaedah abstrak dinyatakan dalam kelas abstrak bernama 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

}

Kelas EntityBase adalah jenis asas untuk semua entiti - kelas entiti Pelanggan memperluas kelas ini dan menyediakan pelaksanaan untuk kaedah abstrak. Pada dasarnya, semua kelas entiti akan menyediakan pelaksanaan kaedah ToString () dan Equals () mereka sendiri. Tidak diperlukan pelaksanaan lalai untuk kaedah ini di kelas asas dan oleh itu mereka ditandai sebagai abstrak. Oleh itu, kaedah overriding dikuatkuasakan dengan menyatakan kaedah tersebut sebagai abstrak dalam kelas asas bernama EntityBase.