c#中的重載和重寫區(qū)別

? 重載的條件:

??????????1.必須在同一個類中2.方法名必須相同3.參數列表不能相同。


???重寫的條件:


??????????1. 在不同的類中


????????? 2. 發(fā)生方法重寫的兩個方法返回值,方法名,參數列表必須完全一致


????????? 3. 子類拋出的異常不能超過父類相應的方法拋出的異常


????????? 4. 子類方法的訪問級別不能低于父類相應方法的訪問級別(public,package,protected, private)


????????? 5.方法體不同



super()調用父類構造,super.只能調用父類的實例方法


this()調用該類的其他構造方法,this.調用類的屬性,方法


如果父類有有參構造,子類必須定義構造方法



重載:



?????? 重載發(fā)生在同一個類中;重載主要是針對同一個類中方法名相同但參數(必須的)不同或返回類型(不是必須的)不同的情況。可以參照如下的代碼




class OverLoadTest


????{


????????public void Hello()


????????{


????????}


????????public void Hello(string str)


????????{


????????}


????????public string Hello()


????????{


????????}


????}


在這段代碼中有三個具有相同名稱的方法Hello,他們彼此之間是重載的關系,注意兩點:他們共同存在于一個類中,雖有同樣的名字但是執(zhí)行不同的操作;第一個方法和第三個方法只有返回類型不同,這在C# 中是不允許的,編譯器會報出“已定義一個名為"Hello"的方法”的錯誤。




重寫:



??????重寫發(fā)生在有繼承關系的類之間


??????重寫發(fā)生在派生類上,通過override關鍵字來改寫從其父類繼承過來的具有相同返回值,方法名稱和參數列表的方法。



????class Program


????{


????????static void Main(string[] args)


????????{


????????????OverWriteTestTT owTT = new OverWriteTestTT();


????????????owTT.Hello();


????????????overWriteTestTTT owTTT = new overWriteTestTTT();


????????????owTTT.Hello();


????????}


????}


????class OverWriteTest


????{


????????//Over write the method ToString();


????????public override string ToString()


????????{


????????????return "hello world";


????????}


????????//Define a virtual method Hello() to be over written


????????public virtual void Hello()


????????{


????????????Console.WriteLine("hello");


????????}


????}


????class OverWriteTestTT : OverWriteTest


????{


????????public override void Hello()


????????{


????????????Console.WriteLine("No hello world");


????????}


????}


????class overWriteTestTTT : OverWriteTestTT


????{


????????//Over write the method Hello() of class OverWriteTestTT


????????public override void Hello()


????????{


????????????base.Hello();


????????????Console.WriteLine("NNo hello world");


????????}


????}


上面這段代碼演示了如何對父類的方法進行重寫,需要注意的地方有兩點:可以在子類中被重寫的方法一定要被標記成virtual(虛擬), abstract(抽象), override(重寫)標記為virtual 和abstract 的函數就是為了重寫而創(chuàng)建的,標記為override的函數本身是由前兩種函數重寫而來的,所以它可以被重寫也是順理成章的了;重寫的函數必須在子類中出現,而且任何一個父類的函數在其一個子類中只能被重寫一次。(這一點很好理解,當你要重寫兩次時,該子類中將定義兩個返回類型,方法名稱 和參數列表都相同的函數,這肯定是不可能的)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,143評論 0 62
  • 昨天開完家長會回來心情十分復雜。去開家長會之前是完全做好了心理準備的,心情十分平靜。開完家長會之后,找老師簡單地聊...
    嚕小嚕閱讀 215評論 7 7
  • 項目管理菜鳥一枚 大學的時候被忽悠報了二學歷(成人教育)的項目管理,學分已經修夠了(雖然平常沒去上過課),現階段迎...
    槑頭腦閱讀 468評論 0 0