C# 多態(tài)性的深入理解
更新時(shí)間:2013年06月09日 08:56:06 作者:
本篇文章是對(duì)C#中的多態(tài)性進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
MSDN 上面的定義:通過(guò)繼承,一個(gè)類可以有多種類型:可以用作它自己的類型,任何基類型,或者在實(shí)現(xiàn)接口時(shí)用作任何接口的類型。
從兩個(gè)方面來(lái)說(shuō)明多態(tài)
1.在運(yùn)行時(shí),方法參數(shù)和集合或者是數(shù)組等位置,派生類的對(duì)象都可以作為基類的對(duì)象處理,發(fā)生此情況時(shí),該對(duì)象的聲明類型不再與運(yùn)行時(shí)類型相同。
2.基類定義實(shí)現(xiàn)虛方法,派生類重寫這些方法,在運(yùn)行時(shí),CLR會(huì)查找運(yùn)行時(shí)類型,并且調(diào)用派生類重寫的方法.
class Shape
{
public virtual void Draw()
{
Console.WriteLine("Draw a shape");
}
}
class Circle : Shape
{
public override void Draw()
{
Console.WriteLine("Draw a circle");
}
}
class Rectangle : Shape
{
public override void Draw()
{
Console.WriteLine("Draw a Rectangle");
}
}
class Triangle : Shape
{
public override void Draw()
{
Console.WriteLine("Draw a Triangle");
}
}
class Programm
{
static void Main()
{
//此次就說(shuō)明了,派生類對(duì)象可以作為基類對(duì)象進(jìn)行處理
Shape[] shapes =
{
new Circle(),
new Rectangle(),
new Triangle()
};
foreach (Shape s in shapes)
{
//調(diào)用Draw()方法的時(shí)候,調(diào)用了派生重寫的方法,而不是基類
s.Draw();
}
}
}
從兩個(gè)方面來(lái)說(shuō)明多態(tài)
1.在運(yùn)行時(shí),方法參數(shù)和集合或者是數(shù)組等位置,派生類的對(duì)象都可以作為基類的對(duì)象處理,發(fā)生此情況時(shí),該對(duì)象的聲明類型不再與運(yùn)行時(shí)類型相同。
2.基類定義實(shí)現(xiàn)虛方法,派生類重寫這些方法,在運(yùn)行時(shí),CLR會(huì)查找運(yùn)行時(shí)類型,并且調(diào)用派生類重寫的方法.
復(fù)制代碼 代碼如下:
class Shape
{
public virtual void Draw()
{
Console.WriteLine("Draw a shape");
}
}
class Circle : Shape
{
public override void Draw()
{
Console.WriteLine("Draw a circle");
}
}
class Rectangle : Shape
{
public override void Draw()
{
Console.WriteLine("Draw a Rectangle");
}
}
class Triangle : Shape
{
public override void Draw()
{
Console.WriteLine("Draw a Triangle");
}
}
class Programm
{
static void Main()
{
//此次就說(shuō)明了,派生類對(duì)象可以作為基類對(duì)象進(jìn)行處理
Shape[] shapes =
{
new Circle(),
new Rectangle(),
new Triangle()
};
foreach (Shape s in shapes)
{
//調(diào)用Draw()方法的時(shí)候,調(diào)用了派生重寫的方法,而不是基類
s.Draw();
}
}
}
相關(guān)文章
C#實(shí)現(xiàn)將程序運(yùn)行信息寫入日志的方法
這篇文章主要介紹了C#實(shí)現(xiàn)將程序運(yùn)行信息寫入日志的方法,可實(shí)現(xiàn)將程序運(yùn)行信息寫入日志并存儲(chǔ)在Debug目錄下的"/Log/PRG"下的功能,涉及C#針對(duì)日志的相關(guān)寫入技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-08-08
unity 如何獲取Text組件里text內(nèi)容的長(zhǎng)度
這篇文章主要介紹了unity 獲取Text組件里text內(nèi)容的長(zhǎng)度操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
c#網(wǎng)絡(luò)喚醒功能實(shí)現(xiàn)
網(wǎng)絡(luò)喚醒實(shí)現(xiàn)了對(duì)網(wǎng)絡(luò)的集中管理,即在任何時(shí)刻,網(wǎng)管中心的IT管理人員可以經(jīng)由網(wǎng)絡(luò)遠(yuǎn)程喚醒一臺(tái)處于休眠或關(guān)機(jī)狀態(tài)的計(jì)算機(jī),下面使用c#實(shí)現(xiàn)網(wǎng)絡(luò)喚醒功能2014-01-01
C#基于HttpWebRequest實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的方法分析
這篇文章主要介紹了C#基于HttpWebRequest實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求的方法,結(jié)合實(shí)例形式分析了C#使用HttpWebRequest類與System.IO類實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-02-02
WinForm實(shí)現(xiàn)跨進(jìn)程通信的方法
這篇文章主要介紹了WinForm實(shí)現(xiàn)跨進(jìn)程通信的方法,通過(guò)一個(gè)WinMessageHelper類實(shí)現(xiàn)這一功能,需要的朋友可以參考下2014-08-08
C# Winform使用log4net進(jìn)行日志記錄
Log4Net是從Java的log4j移植過(guò)來(lái)的,功能也與log4j類似,可以把日志信息輸出到文件、數(shù)據(jù)庫(kù)等不同的介質(zhì)或目標(biāo),下面我們就來(lái)學(xué)習(xí)一下如何使用log4net進(jìn)行日志記錄吧2023-11-11
Unity實(shí)現(xiàn)3D貪吃蛇的移動(dòng)代碼
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)3D貪吃蛇的移動(dòng)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
C#中免費(fèi)密碼庫(kù)BouncyCastle的使用詳解
這篇文章主要來(lái)和大家分享一個(gè)C#版開(kāi)源、免費(fèi)的Bouncy?Castle密碼庫(kù):BouncyCastle,文中介紹了BouncyCastle的具體使用,需要的可以參考下2024-03-03

