国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - ASP.NET教程 - C#與.net高級(jí)編程 C#的多態(tài)介紹

C#與.net高級(jí)編程 C#的多態(tài)介紹

2019-10-10 10:50腳本之家 ASP.NET教程

封裝、繼承、多態(tài),面向?qū)ο蟮娜筇匦裕皟身?xiàng)理解相對(duì)容易,但要理解多態(tài),特別是深入的了解,對(duì)于初學(xué)者而言可能就會(huì)有一定困難了

用virtual關(guān)鍵字標(biāo)記的方法稱為虛方法,如果子類希望改變虛方法的實(shí)現(xiàn)細(xì)節(jié)就必須使用 override關(guān)鍵字。 
抽象類 
abstract關(guān)鍵字 
防止創(chuàng)建毫無(wú)意義的基本類,使用abstract關(guān)鍵字創(chuàng)建抽象基類,防止被實(shí)例化 
使用abstract關(guān)鍵字創(chuàng)建抽象方法,強(qiáng)制每一個(gè)子類重寫特定的方法,abstract成員沒(méi)有提供任何實(shí)現(xiàn)。 
(注:抽象方法只可以定義在抽象類中,如果不是這樣的話,就會(huì)收到編譯器錯(cuò)誤) 
成員投影 
如果派生類定義的成員和定義在蕨類中的成員一致,派生類投影了父類的版本。 
如:我們從一個(gè)不是自己創(chuàng)建的類來(lái)創(chuàng)建子類就是很可能發(fā)生這樣的情況(基類和子類出現(xiàn)同一個(gè)方法名。) 
解決方案: 
使用override關(guān)鍵字更新父版本,但是如果我們對(duì)定義基類的代碼沒(méi)有訪問(wèn)權(quán)限,我們就不能將方法修改為虛方法。 
我們可以為派生類型的成員添加new 關(guān)鍵字。這樣就可以表明派生類型的實(shí)現(xiàn)故意設(shè)計(jì)為隱藏父類的版本。

封裝、繼承、多態(tài),面向?qū)ο蟮娜筇匦裕皟身?xiàng)理解相對(duì)容易,但要理解多態(tài),特別是深入的了解,對(duì)于初學(xué)者而言可能就會(huì)有一定困難了。我一直認(rèn)為學(xué)習(xí)OO的最好方法就是結(jié)合實(shí)踐,封裝、繼承在實(shí)際工作中的應(yīng)用隨處可見(jiàn),但多態(tài)呢?也許未必,可能不經(jīng)意間用到也不會(huì)把它跟“多態(tài)”這個(gè)詞對(duì)應(yīng)起來(lái)。在此拋磚引玉,大家討論,個(gè)人能力有限,不足之處還請(qǐng)指正。 

之前看到過(guò)類似的問(wèn)題:如果面試時(shí)主考官要求你用一句話來(lái)描述多態(tài),盡可能的精煉,你會(huì)怎么回答?當(dāng)然答案有很多,每個(gè)人的理解和表達(dá)不盡相同,但我比較趨向這樣描述:通過(guò)繼承實(shí)現(xiàn)的不同對(duì)象調(diào)用相同的方法,表現(xiàn)出不同的行為,稱之為多態(tài)。 

復(fù)制代碼代碼如下:


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... 

在上面的例子中,通過(guò)繼承,使得Animal對(duì)象數(shù)組中的不同的對(duì)象,在調(diào)用Eat()方法時(shí),表現(xiàn)出了不同的行為。 
多態(tài)的實(shí)現(xiàn)看起來(lái)很簡(jiǎn)單,要完全理解及靈活的運(yùn)用c#的多態(tài)機(jī)制,也不是一件容易的事,有很多需要注意的地方。 

1.new的用法 
先看下面的例子。 
例2: 

復(fù)制代碼代碼如下:


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 new void Eat() 

Console.WriteLine("Cat eat"); 



class Tester 

static void Main(string[] args) 

Animal a = new Animal(); 
a.Eat(); 

Animal ac = new Cat(); 
ac.Eat(); 

Cat c = new Cat(); 
c.Eat(); 

}


運(yùn)行結(jié)果為: 
Animal eat... 
Animal eat... 
Cat eat... 

可以看出,當(dāng)派生類Cat的Eat()方法使用new修飾時(shí),Cat的對(duì)象轉(zhuǎn)換為Animal對(duì)象后,調(diào)用的是Animal類中的Eat()方法。其實(shí)可以理解為,使用new關(guān)鍵字后,使得Cat中的Eat()方法和Animal中的Eat()方法成為毫不相關(guān)的兩個(gè)方法,只是它們的名字碰巧相同而已。所以, Animal類中的Eat()方法不管用還是不用virtual修飾,也不管訪問(wèn)權(quán)限如何,或者是沒(méi)有,都不會(huì)對(duì)Cat的Eat()方法產(chǎn)生什么影響(只是因?yàn)槭褂昧薾ew關(guān)鍵字,如果Cat類沒(méi)用從Animal類繼承Eat()方法,編譯器會(huì)輸出警告)。 

我想這是設(shè)計(jì)者有意這么設(shè)計(jì)的,因?yàn)橛袝r(shí)候我們就是要達(dá)到這種效果。嚴(yán)格的說(shuō),不能說(shuō)通過(guò)使用new來(lái)實(shí)現(xiàn)多態(tài),只能說(shuō)在某些特定的時(shí)候碰巧實(shí)現(xiàn)了多態(tài)的效果。 

2.override實(shí)現(xiàn)多態(tài) 
真正的多態(tài)使用override來(lái)實(shí)現(xiàn)的。回過(guò)去看前面的例1,在基類Animal中將方法Eat()用virtual標(biāo)記為虛擬方法,再在派生類Cat和Dog中用override對(duì)Eat()修飾,進(jìn)行重寫,很簡(jiǎn)單就實(shí)現(xiàn)了多態(tài)。需要注意的是,要對(duì)一個(gè)類中一個(gè)方法用override修飾,該類必須從父類中繼承了一個(gè)對(duì)應(yīng)的用virtual修飾的虛擬方法,否則編譯器將報(bào)錯(cuò)。 

好像講得差不多了,還有一個(gè)問(wèn)題,不知道你想沒(méi)有。就是多層繼承中又是怎樣實(shí)現(xiàn)多態(tài)的。比如類A是基類,有一個(gè)虛擬方法method()(virtual修飾),類B繼承自類A,并對(duì)method()進(jìn)行重寫(override修飾),現(xiàn)在類C又繼承自類B,是不是可以繼續(xù)對(duì)method()進(jìn)行重寫,并實(shí)現(xiàn)多態(tài)呢?看下面的例子。 

例3:

復(fù)制代碼代碼如下:


Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->public class Animal 

public virtual void Eat() 

Console.WriteLine("Animal eat"); 



public class Dog : Animal 

public override void Eat() 

Console.WriteLine("Dog eat"); 



public class WolfDog : Dog 

public override void Eat() 

Console.WriteLine("WolfDog eat"); 



class Tester 

static void Main(string[] args) 

Animal[] animals = new Animal[3]; 

animals[0] = new Animal(); 
animals[1] = new Dog(); 
animals[2] = new WolfDog(); 

for (int i = 0; i < 3; i++) 

animals[i].Eat(); 


}


運(yùn)行結(jié)果為: 
Animal eat... 
Dog eat... 
WolfDog eat... 

在上面的例子中類Dog繼承自類Animal,對(duì)方法Eat()進(jìn)行了重寫,類WolfDog又繼承自Dog,再一次對(duì)Eat()方法進(jìn)行了重寫,并很好地實(shí)現(xiàn)了多態(tài)。不管繼承了多少層,都可以在子類中對(duì)父類中已經(jīng)重寫的方法繼續(xù)進(jìn)行重寫,即如果父類方法用override修飾,如果子類繼承了該方法,也可以用override修飾,多層繼承中的多態(tài)就是這樣實(shí)現(xiàn)的。要想終止這種重寫,只需重寫方法時(shí)用sealed關(guān)鍵字進(jìn)行修飾即可。 

3. abstract-override實(shí)現(xiàn)多態(tài) 
先在我們?cè)趤?lái)討論一下用abstract修飾的抽象方法。抽象方法只是對(duì)方法進(jìn)行了定義,而沒(méi)有實(shí)現(xiàn),如果一個(gè)類包含了抽象方法,那么該類也必須用abstract聲明為抽象類,一個(gè)抽象類是不能被實(shí)例化的。對(duì)于類中的抽象方法,可以再其派生類中用override進(jìn)行重寫,如果不重寫,其派生類也要被聲明為抽象類。看下面的例子。 
例4: 

復(fù)制代碼代碼如下:


Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> public abstract class Animal 

    public abstract void 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"); 



public class WolfDog : Dog 

public override void Eat() 

Console.WriteLine("Wolfdog eat"); 



class Tester 

static void Main(string[] args) 

Animal[] animals = new Animal[3]; 

animals[0] = new Cat(); 
animals[1] = new Dog(); 
animals[2] = new WolfDog(); 

for (int i = 0; i < animals.Length; i++) 

animals[i].Eat(); 


}


運(yùn)行結(jié)果為: 
Cat eat... 
Dog eat... 
Wolfdog eat... 
從上面可以看出,通過(guò)使用abstract-override可以和virtual-override一樣地實(shí)現(xiàn)多態(tài),包括多層繼承也是一樣的。不同之處在于,包含虛擬方法的類可以被實(shí)例化,而包含抽象方法的類不能被實(shí)例化。 
以上就是我對(duì)c#中多態(tài)的一些淺薄的認(rèn)識(shí),如有錯(cuò)誤的地方,歡迎批評(píng)指正!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产日韩一区二区 | 一级特黄录像免费播放全99 | 亚洲高清资源 | 国产精品日韩在线观看 | 日本欧美在线 | 日韩精品视频在线观看免费 | 亚洲自拍偷拍在线 | 国产精品不卡视频 | 精品黑人一区二区三区久久 | 免费黄色电影在线观看 | 免费看一区二区三区 | 黄色av网站在线观看 | 成人在线精品视频 | 久草久| 69久久夜色精品国产69乱www | 久久香视频| 欧美日韩一级视频 | 91精品在线播放 | 九九人人| 日韩一区中文字幕 | 日韩视频精品在线 | 欧美成人毛片 | 亚洲视频欧美视频 | www.日韩系列 | 亚洲三区在线观看 | 一区二区三区四区av | 蜜桃精品久久久久久久免费影院 | 欧美在线视频一区 | 日韩成人在线影院 | 成人毛片在线观看视频 | 亚洲精品在线视频 | 一区二区三区四区电影 | 欧美电影免费网站 | 久久福利电影 | 精品久久精品 | 国产最新视频 | 中文在线播放 | 国产福利电影一区 | 亚洲激情视频 | 婷婷中文字幕 | 国产精品视频一区二区三区不卡 |