程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#類的多態性詳解

C#類的多態性詳解

編輯:C#入門知識

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

運轉後果:

 

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved