淺談重載與重寫

重載跟重寫,名字很相近,結構看起來也有幾分神似,可是它們各自的特色仍是很鮮明的,不過總有人常常分不清它們兩個。下面我用我粗淺的理解說說他們兩個,但願可以幫助你們理解它們各自的特色。
重載跟重寫從做用的範圍和對象上來講的區別就是——重載是類內部函數(方法)之間的一種關係,而重寫則是類與類(父類和子類)之間的一種關係。下面咱們一VB.Net爲例分析一下
 
重載:
 
重載發生於一個類中,經過多個名稱相同的方法(函數)實現,但參數不相同(數量不一樣、類型不一樣),或者方法返回類型不相同來加以區別(須要注意的是,若是僅僅是返回值不一樣,是不能夠重載的)。
 
在VB.Net裏面重載的關鍵字爲Overloads,看看下面的代碼:
 
複製代碼
Public Class Student
'聲明一個方法
Public Overloads Function GetStuInfo(ByVal Name As String) As String
Console.WriteLine(Name)
Return Nothing
End Function
 
'重載以前聲明的方法,增長了一個參數
 
Public Overloads Function GetStuInfo(ByVal Name As String, ByVal StuID As String) As String
Console.WriteLine(Name, StuID)
Return Nothing
End Function
 
'第二次重載,增長了一個參數,並且類型也與以前的不一樣
Public Overloads Function GetStuInfo(ByVal Name As String, ByVal Stuid As String, ByVal Age As Integer) As String
Console.WriteLine(Name, Stuid, Age)
Return True
End Function
End Class
複製代碼

 

  

 
有一點須要注意:在一個類裏重載時,能夠省去關鍵字Overloads,可是前提要保持一致,就是說若省則全省,加則全加。能夠簡單歸納爲「有福同享有難同當」。
 
總結:
一、在使用重載時只能經過相同的方法名,不一樣的參數類型,不一樣的參數個數實現;
二、不能經過訪問權限、拋出的異常進行重載;
三、方法的異常類型和數目不會對重載形成影響;
四、若是兩個同名函數僅返回類型不相同,則它們不能重載。
五、若是該方法是重載父類中的方法。那麼必須加 Overloads 關鍵字。
 
重寫:
 
重寫是發生在父類與子類之間的關係。就是子類能夠重寫父類的方法。它要求子類的方法名稱及參數(類型和數量)必須與父類徹底一致。
 
在 VB.NET 中,重寫汲及到的關鍵字有:
OverRidable: 用於在父類中聲明的能夠被重寫的方法。
OverRides: 用於在子類中聲明的要重寫的方法。
MustOverRide: 用於在父類中聲明必須被重寫的方法。此時,該類必須聲明爲抽象類。
MustInherit:用於聲明抽象類,MustOverRide類型的方法必須在抽象類中聲明。
NotOverridable: 用於在父類中聲明不能夠被重寫的方法。
 
下面是一個小例子:
 
複製代碼
'聲明一個必須被繼承的抽象類

Public MustInherit Class People
Public MustOverride Function GetName() As String
End Class
 
'聲明一個類並繼承People,

 
Public Class Father : Inherits People
 
'重寫People中的方法
 
Public Overrides Function GetName() As String
Console.WriteLine("個人父類是People")
Return True
End Function
 
'從新聲明一個方法,用來在子類中使用NotOverridable
 
Public Overridable Function ShowMe() As String
Return "父親"
End Function
End Class
 
'繼承Father並重寫其方法
 
Public Class Son : Inherits Father
 
'重寫Father中的方法
Public Overrides Function GetName() As String
Console.WriteLine("個人父類是Father")
Return True
End Function
 
'聲明一個不能夠在Son子類中重寫的方法,要聲明一個NotOverridable的方法,那麼此方法必須同時也聲明爲Overrides類型
 
Public NotOverridable Overrides Function ShowMe() As String
Return "兒子"
End Function
End Class
 
複製代碼

 

  

以上代碼中Father類必須重寫People類中的GetName方法,而Son類就能夠不重寫。也就是說抽象類中的抽象方法必須在其直接子類中重寫,而不須要在其」孫類「中重寫。
 
總結:
 
  一、必須是子類與父類之間。
  二、方法名、返回值類型、參數個數和參數類型都必須相同。
  三、子類類重寫的方法的訪問權限不能低於基類的權限(public>protected>default>private)。
  四、重寫的方法所拋出的異常必須和被重寫方法的所拋出的異常一致,或者是其子類。
  五、被重寫的方法不能爲private,不然在其子類中只是新定義了一個方法,並無對其進行重寫。
  六、靜態方法不能被重寫爲非靜態的方法(會編譯出錯)。
相關文章
相關標籤/搜索