C#與.net高級編程 C#的多態介紹
2024-09-07 17:05:24
供稿:網友
用virtual關鍵字標記的方法稱為虛方法,如果子類希望改變虛方法的實現細節就必須使用 override關鍵字。
抽象類
abstract關鍵字
防止創建毫無意義的基本類,使用abstract關鍵字創建抽象基類,防止被實例化
使用abstract關鍵字創建抽象方法,強制每一個子類重寫特定的方法,abstract成員沒有提供任何實現。
(注:抽象方法只可以定義在抽象類中,如果不是這樣的話,就會收到編譯器錯誤)
成員投影
如果派生類定義的成員和定義在蕨類中的成員一致,派生類投影了父類的版本。
如:我們從一個不是自己創建的類來創建子類就是很可能發生這樣的情況(基類和子類出現同一個方法名。)
解決方案:
使用override關鍵字更新父版本,但是如果我們對定義基類的代碼沒有訪問權限,我們就不能將方法修改為虛方法。
我們可以為派生類型的成員添加new 關鍵字。這樣就可以表明派生類型的實現故意設計為隱藏父類的版本。
封裝、繼承、多態,面向對象的三大特性,前兩項理解相對容易,但要理解多態,特別是深入的了解,對于初學者而言可能就會有一定困難了。我一直認為學習OO的最好方法就是結合實踐,封裝、繼承在實際工作中的應用隨處可見,但多態呢?也許未必,可能不經意間用到也不會把它跟“多態”這個詞對應起來。在此拋磚引玉,大家討論,個人能力有限,不足之處還請指正。
之前看到過類似的問題:如果面試時主考官要求你用一句話來描述多態,盡可能的精煉,你會怎么回答?當然答案有很多,每個人的理解和表達不盡相同,但我比較趨向這樣描述:通過繼承實現的不同對象調用相同的方法,表現出不同的行為,稱之為多態。
代碼如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->public class Animal
{
public virtual void Eat()
{
Console.WriteLine("Animal eat");
}
}
public class Cat : Animal
{
public override void Eat()
{
Console.WriteLine("Cat eat");
}
}
public class Dog : Animal
{
public override void Eat()
{
Console.WriteLine("Dog eat");
}
}
class Tester
{
static void Main(string[] args)
{
Animal[] animals = new Animal[3];
animals[0] = new Animal();
animals[1] = new Cat();
animals[2] = new Dog();
for (int i = 0; i < 3; i++)
{
animals[i].Eat();
}
}
}
輸出如下:
Animal eat...
Cat eat...
Dog eat...
在上面的例子中,通過繼承,使得Animal對象數組中的不同的對象,在調用Eat()方法時,表現出了不同的行為。
多態的實現看起來很簡單,要完全理解及靈活的運用c#的多態機制,也不是一件容易的事,有很多需要注意的地方。