C 多態性 多態性常被視為自封裝和繼承之後,面向對象的編程的第三個支柱。 Polymorphism(多態性)是一個希臘詞,指“多種形態”, 多態: 一個介面多個功能。 靜態多態性: 編譯時發生函數響應(調用); 動態多態性: 運行時發生函數響應。 靜態綁定(早期綁定): 編譯時函數和對象的連接機制。 ...
C# 多態性
多態性常被視為自封裝和繼承之後,面向對象的編程的第三個支柱。 Polymorphism(多態性)是一個希臘詞,指“多種形態”,
多態:一個介面多個功能。
靜態多態性:編譯時發生函數響應(調用);
動態多態性:運行時發生函數響應。
靜態綁定(早期綁定):編譯時函數和對象的連接機制。 兩種技術實現靜態多態性:函數重載/運算符重載。
函數重載:在同一範圍內對相同函數名有多個定義,可以是參數類型或參數個數的不同,但不許只有返回值類型不同。
運算符重載:
關鍵字 abstract 聲明抽象類:用於介面部分類的實現(派生類繼承抽象類時,實現完成)。抽象類包含抽象方法,抽象方法可被派生類實現。
多態實現
實現多態三種方式:
抽象類
C# 允許您使用關鍵字 abstract 創建抽象類,用於提供介面的部分類的實現。當一個派生類繼承自該抽象類時,實現即完成。抽象類包含抽象方法,抽象方法可被派生類實現。派生類具有更專業的功能。
請註意,下麵是有關抽象類的一些規則:
- 抽象類不能實例化。
- 不能在一個抽象類外部聲明一個抽象方法。
- 通過在類定義前面放置關鍵字 sealed,可以將類聲明為密封類。當一個類被聲明為 sealed 時,它不能被繼承。抽象類不能被聲明為 sealed。
public abstract class A
{
public abstract void DoWork(int i);
}
public class B : A
{
public override void DoWork(int i)
{
// New implementation.
}
}
//main
A a= new B();
a.Dowirk(1);
介面類
使用介面可以在類中包括來自多個源的行為。 由於C#語言不支持多重繼承,所以該功能很重要。 此外,如果要模擬結構的繼承,也必須使用介面,因為它們無法實際從另一個結構或類繼承。
一個類能同時實現多個介面,還能在實現介面的同時再繼承其他類,並且介面之間也可以繼承。
介面定義
interface 介面名稱
{
介面成員;
}
interface IEquatable<T>
{
bool Equals(T obj);
}
介面是一種規範。
為了多態,介面不能被實例化。
介面不能添加訪問修飾符,預設公開(piblic)。
介面只能有,方法,屬性,索引器,事件,不能有欄位和構造函數。
介面與介面直接可以被繼承,且可以多繼承。
介面不能繼承類,類可以繼承介面
實現介面的子類必須實現該介面的全部成員
一個類可以同時繼承一個類並實現多個介面
顯示實現
實現目的:解決方法重命名問題
什麼時候實現:當繼承介面中的方法和參數一模一樣時
interface ILeft
{
int P { get;}
}
interface IRight
{
int P();
}
為了同時實現兩個介面,類必須對屬性 P 和/或方法 P 使用顯式實現以避免編譯器錯誤。
class Middle : ILeft, IRight
{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}
虛方法
類中定義的允許在派生類中重寫的方法,使用virtual關鍵字定義
// Virtual method
public virtual void Draw()
{
Console.WriteLine("Performing base class drawing tasks");
}
class Circle : Shape
{
public override void Draw()
{
// Code to draw a circle...
Console.WriteLine("Drawing a circle");
base.Draw();
}
}