C# におけるポリモーフィズムの定義は、同じ操作が異なるクラスのインスタンスに作用し、異なるクラスが異なる解釈を実行し、最終的に異なる実行結果を生成することです。言い換えれば、1 つのインターフェイスに複数の機能があります。
C# は、コンパイル時ポリモーフィズムと実行時ポリモーフィズムの 2 つの形式のポリモーフィズムをサポートします
コンパイル時ポリモーフィズム:
コンパイル時ポリモーフィズムはオーバーロードを通じて実現されます
メソッドのオーバーロード
同じ関数を複数定義できます同じスコープ内の名前。関数定義は、パラメーター リスト内のパラメーターのタイプまたはパラメーターの数によって、互いに異なっている必要があります。戻り値の型のみが異なる関数宣言はオーバーロードできません。例を書いてみましょう
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class exchange //定义一个exchange类 {//方法实现交换两参数数据 public void swap(int a, int b) { int temp; temp = a; a = b; b = temp; Console.WriteLine("{0},{1}",a,b); } public void swap(string a, string b) { string temp; temp = a; a = b; b = temp; Console.WriteLine("{0},{1}", a, b); } } class program { static void Main(string[] args) { exchange exch = new exchange(); exch.swap(10, 20); //调用 swap(int a,int b)方法 exch.swap("大", "小"); //调用 swap(string a,string b)方法 } } }
結果:
演算子のオーバーロード
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class student //定义student类 { private int Chinese; private int Math; public void value(int a, int b) //定义一个赋值的方法,以后学了构造方法就不这么麻烦了 { Chinese = a; Math = b; } public static student operator + (student a, student b) //运算符重载,实现相加功能 { student stu = new student(); stu.Chinese = a.Chinese + b.Chinese; stu.Math = a.Math + b.Math; return stu; } public int getChinese() //获取Chinese 的方法 { return Chinese; } public int getMath() //获取Math 的方法 { return Math; } } class program { static void Main(string[] args) { student a = new student(); student b = new student(); a.value(70,80); b.value(40, 50); student stu = a + b; //70+40, 80+50 Console.WriteLine("a+b Chinese = {0}\na+b Math = {1}", stu.getChinese(), stu.getMath()); } } }
結果:
実行時のポリモーフィズム:
ランタイムポリモーフィズムとは、システムが実行されるまで実際の状況が変更されないことを意味します。実装するには、C# のランタイム ポリモーフィズムは、抽象クラスまたは仮想メソッドを通じて実装されます。
抽象クラスと抽象メソッド
C#ではabstractというキーワードを使って抽象クラスや抽象メソッドを作成することができ、派生クラスが抽象クラスを継承すると実装が完了します。抽象クラスには、派生クラスによって実装できる抽象メソッドが含まれています。派生クラスには、より特殊な機能があります。抽象クラスはインスタンス化できません、
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test {//创建抽象类和抽象方法 abstract class score { public abstract int Add(); } //创建子类 class student : score { private int Chinese = 80; private int Math = 90; public override int Add() //关键字 override 实例方法 { int sum=Chinese+Math; return sum; } } class program { static void Main(string[] args) { student stu = new student(); Console.WriteLine(stu.Add() ); //结果 170 } } }
仮想メソッド
仮想メソッドはキーワードvirtualを使用して宣言されます。仮想メソッドは、継承されたクラスごとに異なる実装を持つことができます。仮想メソッドの呼び出しは実行時に行われます。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class score { protected int Chinese = 80; protected int Math = 90; public virtual int Add() //定义一个虚方法 { int sum = Chinese + Math; return sum; } } //定义子类,实现方法 class student : score { public override int Add() //关键字 override 实例方法,实现相减操作 { int sub = Math - Chinese ; return sub; } } class program { static void Main(string[] args) { student stu = new student(); Console.WriteLine(stu.Add() ); //结果 10 } } }
実際に実行時に呼び出されるメソッドは仮想メソッドではなく、オーバーライドインスタンス後のメソッドであることが分かります
以上、C#学習日記23---演算子の多重定義、メソッドの多重定義、抽象クラス、For仮想メソッドのコンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。関連コンテンツの詳細については、こちらをご覧ください。