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); //顯示派生類數據
}//兩次挪用完整雷同的辦法,實參分歧,完成的功效分歧
}
}
運轉後果:

以上就是本文的全體內容,願望可以或許幫到年夜家。