C#中面向?qū)ο缶幊虣C(jī)制之多態(tài)學(xué)習(xí)筆記
C#的多態(tài)性:
我的理解是:同一個(gè)操作,作用于不同的對(duì)象時(shí),會(huì)有不同的結(jié)果,即同一個(gè)方法根據(jù)需要,作用于不同的對(duì)象時(shí),會(huì)有不同的實(shí)現(xiàn)。
C#的多態(tài)包括:接口多態(tài),繼承多態(tài)。
其中繼承多態(tài)又包括通過(guò)虛擬方法實(shí)現(xiàn)的多態(tài)和通過(guò)抽象方法實(shí)現(xiàn)的多態(tài)性
例如:基類動(dòng)物都有吃的方法,但是不同的動(dòng)物吃的東西就會(huì)不一樣,例如狼吃肉,羊吃草,這樣“吃”的這個(gè)方法就要在派生類里面重新實(shí)現(xiàn)以下,運(yùn)行時(shí),通過(guò)指向基類的指針,來(lái)調(diào)用實(shí)現(xiàn)派生類中的方法。
接下來(lái)舉例實(shí)現(xiàn)多態(tài)性。
1. 接口多態(tài)性
把動(dòng)物“吃”的方法放到一個(gè)接口(IAnimal)里,然后讓具體的動(dòng)物類(Wolf/Sheep)繼承這個(gè)接口,并根據(jù)自己的需要實(shí)現(xiàn)這個(gè)接口。
代碼實(shí)現(xiàn):
class Program {
static void Main(string[] args) {
new Wolf().Eat();
new Sheep().Eat();
}
}
public class Wolf : IAnimal {
//多態(tài)實(shí)現(xiàn)
public void Eat() {
Console.WriteLine("狼吃肉!");
}
}
public class Sheep : IAnimal {
//多態(tài)實(shí)現(xiàn)
public void Eat() {
Console.WriteLine("羊吃草!");
}
}
//接口
public interface IAnimal {
void Eat();
}
接口的多態(tài)性就是當(dāng)不同的類繼承了相同的接口以后,都要根據(jù)自己的需要重新實(shí)現(xiàn)繼承的接口,這樣同樣的方法簽名在不同的類中就會(huì)實(shí)現(xiàn)不同的操作。
2. 繼承的多態(tài)性
2.1.通過(guò)虛擬方法實(shí)現(xiàn)的多態(tài)(virtual,override)
首先要在基類中實(shí)現(xiàn)virtual方法,然后在派生類中根據(jù)自己的需要用override重寫virtual方法。如果不希望這個(gè)方法被繼續(xù)重寫,則把這個(gè)方法寫成sealed方法。
virtual方法必須在基類中實(shí)現(xiàn)。
代碼實(shí)現(xiàn):
class Program {
static void Main(string[] args) {
new Wolf().Eat();
new Sheep().Eat();
new Goat().Eat();
}
}
public class Wolf : Animal {
//多態(tài)實(shí)現(xiàn)
public override void Eat() {
base.Eat();
Console.WriteLine("狼吃肉!");
}
}
public class Sheep : Animal {
//多態(tài)實(shí)現(xiàn)
public override void Eat() {
base.Eat();
Console.WriteLine("羊吃草!");
}
}
public class Goat : Sheep {
//多態(tài)實(shí)現(xiàn)被終結(jié),此Eat方法不能被override,因?yàn)橛胹ealed了
public sealed override void Eat() {
//base.Eat();
Console.WriteLine("山羊吃草!");
}
}
//基類實(shí)現(xiàn)虛方法
public class Animal {
public virtual void Eat() { }
}
2.2.通過(guò)抽象方法實(shí)現(xiàn)的多態(tài)(abstract,override)
抽象方法必須定義在抽象類里。抽象類不能被創(chuàng)建實(shí)例。
基類中的抽象方法只能被聲明,不需要實(shí)現(xiàn),所以派生類中重寫抽象方法的時(shí)候沒(méi)有base方法。
代碼實(shí)現(xiàn)如下:
class Program {
static void Main(string[] args) {
new Wolf().Eat();
new Sheep().Eat();
new Goat().Eat();
}
}
public class Wolf : Animal {
//多態(tài)實(shí)現(xiàn)
public override void Eat() {
Console.WriteLine("狼吃肉!");
}
}
public class Sheep : Animal {
//多態(tài)實(shí)現(xiàn)
public override void Eat() {
Console.WriteLine("羊吃草!");
}
}
public class Goat : Sheep {
//多態(tài)實(shí)現(xiàn)被終結(jié),此Eat方法不能被override,因?yàn)橛胹ealed了
public sealed override void Eat() {
Console.WriteLine("山羊吃草!");
}
}
//基類只需聲明方法
public abstract class Animal {
public abstract void Eat();
}
總結(jié):
1.虛方法重寫的時(shí)候可以有base方法(base.Eat()),抽象方法重寫的時(shí)候沒(méi)有base方法,原因是:虛方法必須在基類中實(shí)現(xiàn),抽象方法只在基類中聲明,不需要實(shí)現(xiàn)。
2.派生類中可以 不重寫虛方法的實(shí)現(xiàn),但是派生類必須重寫抽象方法的實(shí)現(xiàn),原因同1.
3.包含虛方法的非抽象類可以被創(chuàng)建實(shí)例(對(duì)象),但是包含抽象方法的抽象類不能被創(chuàng)建實(shí)例。
4.繼承接口的派生類必須實(shí)現(xiàn)接口的方法,因?yàn)榻涌谝彩侵回?fù)責(zé)聲明方法,不負(fù)責(zé)實(shí)現(xiàn)。
5.接口的多態(tài)性不需要用override重寫方法。
相關(guān)文章
Silverlight文件上傳下載實(shí)現(xiàn)方法(下載保存)
這篇文章主要介紹了Silverlight文件上傳下載實(shí)現(xiàn)方法(下載保存) ,需要的朋友可以參考下2015-11-11C#?JWT權(quán)限驗(yàn)證的實(shí)現(xiàn)
本文主要介紹了C#?JWT權(quán)限驗(yàn)證的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03asp.net頁(yè)面中如何獲取Excel表的內(nèi)容
在瀏覽網(wǎng)頁(yè)時(shí),一定會(huì)看到我們需要保存的信息,我們比較常用的方法就是拖動(dòng)鼠標(biāo),選中我們需要的內(nèi)容,然后ctrl+c,然后在保持到excel當(dāng)中去,那么如何用asp.net獲取excel表的內(nèi)容呢,下面小編就給大家介紹asp.net獲取excel表的內(nèi)容,需要的朋友可以參考下2015-08-08詳解C# 網(wǎng)絡(luò)編程系列:實(shí)現(xiàn)類似QQ的即時(shí)通信程序
本篇主要介紹了c#實(shí)現(xiàn)類似QQ的即時(shí)通信程序 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12C# 文件操作函數(shù) 創(chuàng)建文件 判斷存在
本文列舉了C#中文件操作中常用的函數(shù),創(chuàng)建文件和判斷文件存不存在的基本使用,簡(jiǎn)單實(shí)用,希望能幫到大家。2016-05-05C#實(shí)現(xiàn)批量Word轉(zhuǎn)換Html的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C#批量Word轉(zhuǎn)換Html的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12用序列化實(shí)現(xiàn)List<T> 實(shí)例的深復(fù)制(推薦)
下面小編就為大家?guī)?lái)一篇用序列化實(shí)現(xiàn)List<T> 實(shí)例的深復(fù)制(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02C#調(diào)用Oracle存儲(chǔ)過(guò)程的方法
這篇文章主要介紹了C#調(diào)用Oracle存儲(chǔ)過(guò)程的方法,包含數(shù)據(jù)庫(kù)及C#對(duì)應(yīng)的調(diào)用代碼,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01c# 成員類型訪問(wèn)權(quán)限低于字段本身的實(shí)現(xiàn)
本文主要介紹了c# 成員類型訪問(wèn)權(quán)限低于字段本身的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02