C#中override和overload的区别
重載應(yīng)該叫overload,重寫(xiě)叫override;重載某個(gè)方法是在同一個(gè)類(lèi)中發(fā)生的!重寫(xiě)是在子類(lèi)中重寫(xiě)父類(lèi)中的方法。
1.override:?? 父類(lèi):public virtual string ToString(){return "a";}
?????????????????? 子類(lèi):public override string ToString(){return "b";}
2.overload:? 同一類(lèi)中或父子關(guān)系類(lèi)中皆可.
?????????????????? public string ToString(){return "a";}
?????????????????? public string ToString(int id){return id.ToString();}
重寫(xiě)(override)是用于重寫(xiě)基類(lèi)的虛方法,這樣在派生類(lèi)中提供一個(gè)新的方法;
重載(overload)是提供了一種機(jī)制, 相同函數(shù)名通過(guò)不同的返回值類(lèi)型以及參數(shù)來(lái)表來(lái)區(qū)分的機(jī)制
=====================================================?
很本質(zhì)的區(qū)別就是看函數(shù)特征:覆寫(xiě)(Override)的兩個(gè)函數(shù)的函數(shù)特征相同,重載(Overload)的兩個(gè)函數(shù)的函數(shù)名雖然相同,但函數(shù)特征不同。
函數(shù)特征包括函數(shù)名、參數(shù)的類(lèi)型和個(gè)數(shù)。
Override 是在繼承的時(shí)候,如果你寫(xiě)的函數(shù)與要繼承的函數(shù)函數(shù)特征相同,那么,加上這個(gè)關(guān)鍵字,在使用這個(gè)子類(lèi)的這個(gè)函數(shù)的時(shí)候就看不見(jiàn)父類(lèi)(或超類(lèi))的函數(shù)了,它被覆蓋掉了。
比如:Derived繼承了Base,Base里面有void A(int a) ,那么如果你Derived里面覺(jué)得A寫(xiě)得不好或不適合這個(gè)類(lèi),你想重新再寫(xiě)一遍A里的代碼,那么就寫(xiě)override void A(int a)這樣,原來(lái)的那個(gè)函數(shù)就被你新寫(xiě)的這個(gè)覆蓋掉了。
overload 是重載,就是說(shuō)函數(shù)名相同,函數(shù)特征不同,系統(tǒng)會(huì)根據(jù)你提供的參數(shù)來(lái)調(diào)相應(yīng)的函數(shù)。
比如:void A(int a)和void A(int a,int b)
如果你用的是A(1)那么調(diào)的是第一個(gè),如果是A(1,1)那么調(diào)的是第二個(gè)。
=====================================================
1. 重寫(xiě)(override)
------------------
使用 override 修飾符來(lái)修改方法、屬性、索引器或事件。重寫(xiě)方法提供從基類(lèi)繼承的成員的新實(shí)現(xiàn)。由重寫(xiě)聲明重寫(xiě)的方法稱(chēng)為重寫(xiě)基方法。重寫(xiě)基方法必須與重寫(xiě)方法具有相同的簽名。
不能重寫(xiě)非虛方法或靜態(tài)方法。重寫(xiě)基方法必須是虛擬的、抽象的或重寫(xiě)的。也就是說(shuō),用 override 修飾符重寫(xiě)的基類(lèi)中的方法必須是 virtual, abstract 或 override 方法。
2. 重載(overload)
------------------
當(dāng)類(lèi)包含兩個(gè)名稱(chēng)相同但簽名不同的方法時(shí)發(fā)生方法重載。
使用重載方法的指南:
a. 用方法重載來(lái)提供在語(yǔ)義上完成相同功能的不同方法。
b. 使用方法重載而不是允許默認(rèn)參數(shù)。默認(rèn)參數(shù)的版本控制性能不好,因此公共語(yǔ)言規(guī)范(CLS)中不允許使用默認(rèn)參數(shù)。
c. 正確使用默認(rèn)值。在一個(gè)重載方法系列中,復(fù)雜方法應(yīng)當(dāng)使用參數(shù)名來(lái)指示從簡(jiǎn)單方法中假定的默認(rèn)狀態(tài)發(fā)生的更改。
d. 對(duì)方法參數(shù)使用一致的排序和命名模式。提供一組重載方法,這組重載方法帶有遞增數(shù)目的參數(shù),以使開(kāi)發(fā)人員可以指定想要的級(jí)別的信息,這種情況很常見(jiàn)。您指定的參數(shù)越多,開(kāi)發(fā)人員就可指定得越詳細(xì)。
e. 如果必須提供重寫(xiě)方法的能力,請(qǐng)僅使最完整的重載是虛擬的并根據(jù)它來(lái)定義其他操作。
下面這個(gè)例子代碼具體解釋一下這種模式,只有最后一個(gè)方法(參數(shù)最完整的方法)是虛方法,在繼承了這個(gè)類(lèi)的子類(lèi)中只要重寫(xiě)(override)這個(gè)方法就行了。
?
public?class?SampleClass
{
???private?string?myString;
???public?SampleClass(string?str)
???{
??????this.myString?=?str;
???}
???public?int?IndexOf(string?s)
???{
??????return?IndexOf?(s,?0);
???}
???public?int?IndexOf(string?s,?int?startIndex)
???{
??????return?IndexOf(s,?startIndex,?myString.Length?-?startIndex?);
???}
???public?virtual?int?IndexOf(string?s,?int?startIndex,?int?count)
???{
??????return?myString.IndexOf(s,?startIndex,?count);
???}
}
轉(zhuǎn)載于:https://www.cnblogs.com/shenzikun1314/p/6393817.html
總結(jié)
以上是生活随笔為你收集整理的C#中override和overload的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JSR-303校验类型
- 下一篇: [译文]c#扩展方法(Extension