C# Polimorfisme
Polymorphism bermaksud mempunyai pelbagai bentuk. Dalam paradigma pengaturcaraan berorientasikan objek, polimorfisme sering dinyatakan sebagai "satu antara muka, pelbagai fungsi."
Polimorfisme boleh menjadi statik atau dinamik. Dalam polimorfisme statik, tindak balas fungsi berlaku pada masa penyusunan. Dalam polimorfisme dinamik, tindak balas fungsi berlaku pada masa jalan.
Polimorfisme statik
Pada masa penyusunan, mekanisme sambungan fungsi dan objek dipanggil pengikatan awal, juga dikenali sebagai pengikatan statik. C# menyediakan dua teknik untuk melaksanakan polimorfisme statik. Ia adalah:
Fungsi lebihan beban
Operator overloading
Operator overloading akan dibincangkan dalam bahagian bab seterusnya, kita akan membincangkan lebihan fungsi seterusnya.
Lebih Muatan Fungsi
Anda boleh mempunyai berbilang takrifan nama fungsi yang sama dalam skop yang sama. Takrifan fungsi mesti berbeza antara satu sama lain, sama ada mengikut jenis parameter dalam senarai parameter atau mengikut bilangan parameter. Pengisytiharan fungsi yang berbeza hanya dalam jenis pemulangan tidak boleh terlebih beban.
Contoh berikut menunjukkan beberapa fungsi yang sama print() untuk mencetak jenis data yang berbeza:
using System; namespace PolymorphismApplication { class Printdata { void print(int i) { Console.WriteLine("Printing int: {0}", i ); } void print(double f) { Console.WriteLine("Printing float: {0}" , f); } void print(string s) { Console.WriteLine("Printing string: {0}", s); } static void Main(string[] args) { Printdata p = new Printdata(); // 调用 print 来打印整数 p.print(5); // 调用 print 来打印浮点数 p.print(500.263); // 调用 print 来打印字符串 p.print("Hello C++"); Console.ReadKey(); } } }
Apabila kod di atas disusun dan dilaksanakan , yang menghasilkan keputusan berikut:
Printing int: 5 Printing float: 500.263 Printing string: Hello C++
Polymorfisme Dinamik
C# membenarkan anda menggunakan kata kunci abstrak untuk mencipta kelas abstrak yang menyediakan pelaksanaan kelas separa antara muka . Pelaksanaan selesai apabila kelas terbitan mewarisi daripada kelas abstrak ini. Kelas abstrakmengandungi kaedah abstrak, yang boleh dilaksanakan oleh kelas terbitan. Kelas terbitan mempunyai fungsi yang lebih khusus.
Sila ambil perhatian bahawa berikut ialah beberapa peraturan tentang kelas abstrak:
Anda tidak boleh mencipta tika kelas abstrak.
Anda tidak boleh mengisytiharkan kaedah abstrak di luar kelas abstrak.
Sesuatu kelas boleh diisytiharkan sebagai kelas tertutup dengan meletakkan kata kunci termeterai di hadapan definisi kelas. Apabila kelas diisytiharkan sebagai dimeterai ia tidak boleh diwarisi. Kelas abstrak tidak boleh diisytiharkan dimeterai.
Atur cara berikut menunjukkan kelas abstrak:
using System; namespace PolymorphismApplication { abstract class Shape { public abstract int area(); } class Rectangle: Shape { private int length; private int width; public Rectangle( int a=0, int b=0) { length = a; width = b; } public override int area () { Console.WriteLine("Rectangle 类的面积:"); return (width * length); } } class RectangleTester { static void Main(string[] args) { Rectangle r = new Rectangle(10, 7); double a = r.area(); Console.WriteLine("面积: {0}",a); Console.ReadKey(); } } }
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
Rectangle 类的面积: 面积: 70
Apabila terdapat fungsi yang ditakrifkan dalam kelas yang perlu dilaksanakan dalam kelas yang diwarisi, anda boleh menggunakan kaedah maya. Kaedah maya diisytiharkan menggunakan kata kunci maya. Kaedah maya boleh mempunyai pelaksanaan yang berbeza dalam kelas warisan yang berbeza. Panggilan kepada kaedah maya berlaku pada masa jalan.
Polymorfisme dinamik dicapai melalui kelas abstrak dan kaedah maya.
Atur cara berikut menunjukkan ini:
using System; namespace PolymorphismApplication { class Shape { protected int width, height; public Shape( int a=0, int b=0) { width = a; height = b; } public virtual int area() { Console.WriteLine("父类的面积:"); return 0; } } class Rectangle: Shape { public Rectangle( int a=0, int b=0): base(a, b) { } public override int area () { Console.WriteLine("Rectangle 类的面积:"); return (width * height); } } class Triangle: Shape { public Triangle(int a = 0, int b = 0): base(a, b) { } public override int area() { Console.WriteLine("Triangle 类的面积:"); return (width * height / 2); } } class Caller { public void CallArea(Shape sh) { int a; a = sh.area(); Console.WriteLine("面积: {0}", a); } } class Tester { static void Main(string[] args) { Caller c = new Caller(); Rectangle r = new Rectangle(10, 7); Triangle t = new Triangle(10, 5); c.CallArea(r); c.CallArea(t); Console.ReadKey(); } } }
Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut:
Rectangle 类的面积: 面积:70 Triangle 类的面积: 面积:25