在 C#語言中體現多態有三種方式:虛方法,抽象類, 接口
一、虛方法
- 什么是虛方法?
在父類中使用 virtual 關鍵字修飾的方法, 就是虛方法。在子類中可以使用 override 關鍵字對該虛方法進行重寫。
class Animal
{public virtual void Speak(){Console.WriteLine("***********");}
}class Dog:Animal
{public override void Speak(){base.Speak();Console.WriteLine("汪汪汪");}public void Type(){Console.WriteLine("我是一只狗");}
}class Cat : Animal
{public override void Speak(){base.Speak();Console.WriteLine("喵喵喵");}public void Type(){Console.WriteLine("我是一只貓");}
}
- 何為里氏轉換
①子類對象可以直接賦值給父類
Cat cat = new Cat();
Animal ann = cat;
cat.Speak();
cat.Type();
ann.Speak();
//報錯,無法執行,ann.Type();
②如果父類中裝的是子類對象,那么可以將該父類強制轉為子類對象
Animal ani = new Dog();
ani.Speak();
//報錯,無法執行,ani.Type();
Dog dog = (Dog)ani;
dog.Type();
③這里我們用的是強制類型轉換,也可以使用is 和 as 轉換
is: 如果轉換成功, 返回 true, 失敗返回 false;
as: 如果轉換成功, 返回對應的對象, 失敗返回 null
Animal ani = new Dog();
if(ani is Dog)
{Dog dog = ani as Dog;dog.Type();
}else if (ani is Cat)
{Cat cat = ani as Cat;cat.Type();
}
二、抽象方法
- 抽象方法的返回值類型前用關鍵字abstract修飾,且無方法體。
public abstract void Hello();
- 抽象方法必須存在于抽象類中。
abstract class Animal
在定義類的關鍵字class前面加 abstract 修飾的類就是抽象類。
子類繼承抽象類,使用 override 關鍵字重寫父類中所有的抽象方法
- 抽象類中不一定要有抽象方法, 但是抽象方法必須存在于抽象類中。
抽象類不能被實例化, 因為抽象類中有抽象方法(無方法體)。
三、接口語法
-
抽象類到接口,當抽象類中所有的方法都是抽象方法的時候,這個時候可以把這個抽象類用另外,一種形式來表現,這種形式叫接口。
-
接口使用 interface 關鍵字定義,沒有 class 關鍵字,接口名一般使用 “IXxxx”
-
接口中定義的方法不能有方法體,全是抽象方法,但又不需要用 abstract 修飾;
-
接口中的成員不允許添加訪問修飾符,默認都是 public;
一個類可以實現多個接口,被實現的多個接口之間用逗號分隔開。
一個接口可以繼承多個接口, 接口之間也要用逗號分隔。
類與類之間只能單繼承。