我們都知道,面向?qū)ο笳Z言的三大特征是:封裝、繼承和多態(tài)。而重寫和重載是多態(tài)的兩種表現(xiàn)形式。多態(tài),顧名思義,就是指多種形態(tài)。而重寫和重載正好體現(xiàn)了這一點。現(xiàn)在我們以 VB.NET 語言來說明兩者的區(qū)別。
創(chuàng)新互聯(lián)公司10多年成都定制網(wǎng)站服務(wù);為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及高端網(wǎng)站定制服務(wù),成都定制網(wǎng)站及推廣,對混凝土攪拌機(jī)等多個方面擁有多年的網(wǎng)站營銷經(jīng)驗的網(wǎng)站建設(shè)公司。
重寫是發(fā)生在父類與子類之間的關(guān)系。具體來講就是子類可以重寫父類的現(xiàn)有的方法。它要求子類的方法名稱及參數(shù)必須與父類完全一致。比如吃飯,父親可以吃兩碗面,孩子同樣也是吃面,卻只能吃一碗。
重載則主要是發(fā)生在同一個類當(dāng)中的,它通過多個名稱相同的方法,但方法參數(shù)不相同,或者方法返回類型不相同來加以區(qū)別。其中,方法參數(shù)不相同包括以下幾種情況:參數(shù)的個數(shù)不相同,參數(shù)的類型不相同,參數(shù)的對應(yīng)位置不相同。需要說明的是,重載同樣可以應(yīng)用到父類與子類當(dāng)中。即子類重載了父類的方法。
重寫:
在 VB.NET 中,重寫汲及到的關(guān)鍵字有:
OverRidable: 在父類中聲明的可以在子類中重寫的方法。
OverRides: 在子類中聲明的要重寫父親中可重寫的方法。
MustOverRide: 在父類中,表示這個方法必須在子類中重寫。此時,該類必須聲明為抽象類。
NotOverridable: 如果當(dāng)前類還有子類,那么,在其子類中,該方法不允許被重寫。
重載:
在 VB.NET 中,重載用到的關(guān)鍵是 OverLoads。
這里需要說明幾點:
1. 對于在同一類當(dāng)中,一組名稱相同的方法或函數(shù)重載時,可以加關(guān)鍵字 OverLoads 或者不加。但如果其中有一個方法加上,那同組其它方法也必須加該關(guān)鍵字。
2. 如果該方法是重載父類中的方法。那么必須加 OverLoads 關(guān)鍵字。
3. 如果兩個同名函數(shù)僅返回類型不相同,則它們不能重載,即必須在參數(shù)上有所不同。
重寫是指重寫基類的方法,在基類中的方法必須有修飾符virtual,而在子類的方法中必須指明override。
格式:
基類中:
public virtual void myMethod()
{
}
子類中:
public override void myMethod()
{
}
重寫以后,用基類對象和子類對象訪問myMethod()方法,結(jié)果都是訪問在子類中重新定義的方法,基類的方法相當(dāng)于被覆蓋掉了。
重載
用于在給定了參數(shù)列表和一組候選函數(shù)成員的情況下,選擇一個最佳函數(shù)成員來實施調(diào)用。
public void test(int x,int y){}
public void test(int x,ref int y){}
public void test(int x,int y,string a){}
重載特征:
I.方法名必須相同
II.參數(shù)列表必須不相同,與參數(shù)列表的順序無關(guān)
III.返回值類型可以不相同
=========================
但如果有泛型,就要注意了!
多態(tài)
c#的多態(tài)性主要體現(xiàn)在類的繼承上:
子類繼承父類的時候,可能出現(xiàn)同名但方法定義不同的情況,
所以在子類中會將原方法覆蓋,實現(xiàn)自身的要求
1 /* 2 ?? ?Function: override 3 */ 4 using System; 5 namespace TestOverride 6 { 7 ? ? class Employee 8 ?? ?{ 9 ? ? ? ? //父類虛方法10 ? ? ? ? public virtual void CalculatePay()11 ?? ? ? ?{12 ? ? ? ? ? ? Console.WriteLine("Employee");13 ?? ? ? ?} ? ? ? ?
14 ?? ?}15 ? ? 16 ? ? ? ?//子類繼承重寫CalculatePay()方法17 ? ? class SalariedEmploy : Employee18 ?? ?{19 ? ? ? ? public override void CalculatePay()20 ?? ? ? ?{21 ? ? ? ? ? ? Console.WriteLine("Salary");22 ?? ? ? ?}23 ?? ?}24 ? ? 25 ? ? class AppPay26 ?? ?{27 ? ? ? ? public static void Main(String[] args)28 ?? ? ? ?{29 ? ? ? ? ? ? //父類創(chuàng)建實例30 ? ? ? ? ? ? Employee employee1 = new Employee();31 ? ? ? ? ? ? employee1.CalculatePay(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //Employee32 ? ? ? ? ? ? ? ? 33 ? ? ? ? ? ? //子類賦值給父類34 ? ? ? ? ? ? Employee employee2 = new SalariedEmploy();35 ? ? ? ? ? ? employee2.CalculatePay(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // Salary36 ? ? ? ? ? ? 37 ? ? ? ? ? ? //子類創(chuàng)建實例38 ? ? ? ? ? ? SalariedEmploy employee3 = new SalariedEmploy();39 ? ? ? ? ? ? employee3.CalculatePay(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//Salary40 ? ? ? ? ? ? 41 ?? ? ? ?} ? ? ? ?
42 ?? ?}43 }44 /*45 Out:46 Employe47 Salary48 Salary49 */
View Code
*****************************************************************************************************************
C#之重載與覆蓋
overload:重載指的是同一個類中有兩個或多個名字相同但是參數(shù)不同的方法,(注:返回值不能區(qū)別函數(shù)是否重載),重載沒有關(guān)鍵字。
override:過載也稱重寫是指子類對父類中虛函數(shù)或抽象函數(shù)的“覆蓋”(這也就是有些書將過載翻譯為覆蓋的原因),但是這種“覆蓋”和用new關(guān)鍵字來覆蓋是有區(qū)別的。
new:覆蓋指的是不同類中(基類或派生類)有兩個或多個返回類型、方法名、參數(shù)都相同,但是方法體不同的方法。
但是這種覆蓋是一種表面上的覆蓋,所以也叫隱藏,被覆蓋的父類方法是可以調(diào)用得到的。
重載覆蓋的發(fā)生條件:
重載,必然發(fā)生在一個類中,函數(shù)名相同,參數(shù)類型或者順序不同構(gòu)成重載,與返回類型無關(guān)
重寫,必然發(fā)生在基類和派生類中,其類函數(shù)用virtual修飾,派生類用override修飾
覆蓋,在子類中寫一個和基類一樣名字(參數(shù)不同也算)的非虛函數(shù),會讓基類中的函數(shù)被隱藏,編譯后會提示要求使用New關(guān)鍵字
重載示例:
public void Fun()
{
Console.WriteLine("I am F");
}
public ?void Fun(int i)
{
Console.WriteLine("I am F,i={0}",i);
}
override重寫特性:
由 override 聲明重寫的方法稱為重寫基方法,重寫的基方法必須與 override 方法具有相同的簽名。
重寫的基方法必須是 virtual、abstract 或 override 的,不能重寫非虛方法或靜態(tài)方法。
override的方法和virtual的方法必須具有相同的訪問級別修飾符,不能更改 virtual 方法的可訪問性。
不能使用new、static 或 virtual 修飾符來修改 override 方法。
重寫屬性聲明必須指定與繼承屬性完全相同的訪問修飾符、類型和名稱,并且被重寫的屬性必須是virtual、abstract 或 override 的。
覆蓋示例:
當(dāng)我們沒有使用覆蓋時,派生類繼承基類,結(jié)果如下:
class A
{
public void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
static void Main(string[] args)
{
Program p = new Program();
p.Fun();
Console.Read();
}
}
//結(jié)果為:I am F
當(dāng)我們覆蓋原來的方法呢?
class A
{
public void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
public new void Fun()
{
int i = 1;
Console.WriteLine("I am F,i={0}", i);
}
static void Main(string[] args)
{
Program p = new Program();
p.Fun();
Console.Read();
}
}
//結(jié)果為:I am F,i=1
new覆蓋與重寫、重載的區(qū)別:
當(dāng)子類與父類的參數(shù)不同時
當(dāng)基類函數(shù)不是虛函數(shù)時,基類函數(shù)將被隱藏。(因為子類和基類不在同一范圍內(nèi),所以不是重載)
當(dāng)基類函數(shù)是虛函數(shù)時,基類函數(shù)將被隱藏。(因為子類和基類不在同一范圍內(nèi),所以不是重載;因為參數(shù)不同,所以不是重寫)
當(dāng)子類與父類的參數(shù)相同時
當(dāng)基類函數(shù)不是虛函數(shù)時,基類函數(shù)將被隱藏。(因為子類和基類不在同一范圍內(nèi),所以不是重載,因為基類不是虛函數(shù),所以是隱藏不是重寫)
當(dāng)基類函數(shù)是虛函數(shù)時,基類函數(shù)將被覆蓋。(因為子類和基類不在同一范圍內(nèi),所以不是重載)
那么為什么不是重寫呢?我們可以做一個例子還測試一下,這個例子在虛函數(shù)時已經(jīng)舉過,在這里為了說明此問題在重復(fù)一下:
class A
{
public virtual void Fun()
{
Console.WriteLine("I am F");
}
}
class Program:A
{
public override void Fun()
{
int i = 1;
Console.WriteLine("I am F,i={0}", i);
}
static void Main(string[] args)
{
A p = new Program();
p.Fun();
Console.Read();
}
}
我們知道,以上例子中,派生類存在一個對基類的重寫方法,所以結(jié)果為:I am F ,i=1
若是我們把override換成new,那么如果是重寫的話,會和上面的結(jié)果相等,但實際結(jié)果是什么呢?
實際的結(jié)果是:I am F
由此我們知道,當(dāng)基類函數(shù)是虛函數(shù)時,基類函數(shù)不是重寫,而是覆蓋了基函數(shù)的同名函數(shù)。
重寫基類的方法啊。你可以重寫別人的類的某些方法、屬性,來實現(xiàn)自己的目的。比如你拿到一輛車,你覺得他的顏色不好看,隨時就涂成你要的顏色。車的性能是沒有多大變化的,不過改了他的顏色,達(dá)到了自己的目的。
vb點虐 的MyBase(mybase)與java的super能基本對應(yīng)。
下圖是一個例子:
當(dāng)前題目:vb點虐
重寫基類方法 vb重置怎么寫
鏈接URL:http://www.rwnh.cn/article22/ddehjcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)頁設(shè)計公司、品牌網(wǎng)站建設(shè)、面包屑導(dǎo)航、定制網(wǎng)站、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)