C#類的多態性詳解。本站提示廣大學習愛好者:(C#類的多態性詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C#類的多態性詳解正文
第一種:編譯時的多態性,直接如許說不曉得說啥?法式履行進程重要分為三步:編譯,鏈接,運轉。在編譯時表現的多態性是經由過程辦法的重載來完成的。辦法的重載我們聽過,就是一個類對象挪用若干同名,但參數類型、個數分歧。類對象是依據參數類型,個數來決議挪用哪一個同名辦法,完成何種操作。C#說話的辦法重載與C++、java根本是一樣的,然則C#還包括C++的運算符重載,java外面沒有這個概念。
第二種:運轉時的多態性,是在體系運轉時,挪用一個名字雷同,參數類型也雷同和個數也完整一樣的辦法,但會完成分歧的操作。C#運轉時的多態性經由過程虛辦法完成。在類辦法聲明加上了virtual潤飾符,稱為虛辦法,反之為非虛辦法。就這一點C#跟C++有許多類似的地方。
代碼清單:虛辦法與非虛辦法的差別
namespace e_11 { class A { public void F() //非虛辦法 { Console.WriteLine("A.F"); } public virtual void G() //虛辦法 { Console.WriteLine("A.G"); } } class B : A //A類為B類的基類 { new public void F() //隱蔽基類的同名非虛辦法F(),留意應用new { Console.WriteLine("B.F"); } public override void G() //隱蔽基類的同名虛辦法G(),留意應用override { Console.WriteLine("B.G"); } } class Test { static void F2(A aA) //留意,參數為A類援用變量 { aA.G(); } static void Main(string[] args) { B b = new B(); A a1 = new A(); A a2 = b; //許可基類援用變量援用派生類對象,a2援用A類的派生類B的對象b a1.F(); //挪用基類A的非虛辦法F(),顯示A.F a2.F(); //F()為非虛辦法,挪用基類A的F(),顯示A.F b.F(); //F()為非虛辦法,挪用派生類的F(),顯示B.F a1.G(); //G()為虛辦法,因a1援用基類A對象,挪用基類A的G(),顯示A.G a2.G(); //G()為虛辦法,因a2援用派生類B對象,挪用派生類B的G(),顯示B.G F2(a2); //因為a2援用A類派生類B的對象b,挪用派生類B的的G(),顯示B.G F2(a1); //實參為基類A對象,挪用A類的函數G(),顯示A.G } } }
輸入成果:
看下面的代碼,我發生了一個疑問?為何由於G()為虛辦法,a2援用派生類B對象,挪用的是B類的G()?
這裡有一個說明:假如將基類援用變量援用分歧對象,或許是基類對象,或許是派生類對象,用這個基類援用變量分離挪用同名虛辦法,依據對象的分歧,會完成分歧的操作。而非虛辦法不具有次此功效。
關於類的多態性典范的例子:
//類的多態性 namespace e_11 { public class Person { private String name = "張三"; //類的成員解釋 private int age = 12; protected virtual void Display() //類的虛辦法 { Console.WriteLine("姓名:{0},年紀:{1}", name, age); } public Person(string Name, int Age) //結構函數,函數名和類名同名,無前往值 { name = Name; age = Age; } static public void DisplayData(Person aPerson) //靜態辦法 { aPerson.Display(); } //不是靜態辦法挪用實例辦法,如寫為Display()毛病 } public class Employe : Person //基類是Person { private string department; private decimal salary; public Employe(string Name, int Age, string D, decimal S) : base(Name, Age) { department = D; salary = S; } protected override void Display() //重載虛辦法,留意用Override { base.Display(); Console.WriteLine("部分:{0}, 薪金:{1}", department, salary); } } class Class1 { static void Main(string[] args) { Person OnePerson = new Person("李四", 30); Person.DisplayData(OnePerson); //顯示基類的數據 Employe OneEmployee = new Employe("王五", 40, "財政", 2000); Person.DisplayData(OneEmployee); //顯示派生類數據 }//兩次挪用完整雷同的辦法,實參分歧,完成的功效分歧 } }
運轉後果:
以上就是本文的全體內容,願望可以或許幫到年夜家。