Inherits
成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)與策劃設(shè)計(jì),普陀網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:普陀等地區(qū)。普陀做網(wǎng)站價(jià)格咨詢:18980820575
Public Class test
Inherits System.Collections.ArrayList
End Class
我們都知道,面向?qū)ο笳Z(yǔ)言的三大特征是:封裝、繼承和多態(tài)。而重寫和重載是多態(tài)的兩種表現(xiàn)形式。多態(tài),顧名思義,就是指多種形態(tài)。而重寫和重載正好體現(xiàn)了這一點(diǎn)?,F(xiàn)在我們以 VB.NET 語(yǔ)言來說明兩者的區(qū)別。
重寫是發(fā)生在父類與子類之間的關(guān)系。具體來講就是子類可以重寫父類的現(xiàn)有的方法。它要求子類的方法名稱及參數(shù)必須與父類完全一致。比如吃飯,父親可以吃兩碗面,孩子同樣也是吃面,卻只能吃一碗。
重載則主要是發(fā)生在同一個(gè)類當(dāng)中的,它通過多個(gè)名稱相同的方法,但方法參數(shù)不相同,或者方法返回類型不相同來加以區(qū)別。其中,方法參數(shù)不相同包括以下幾種情況:參數(shù)的個(gè)數(shù)不相同,參數(shù)的類型不相同,參數(shù)的對(duì)應(yīng)位置不相同。需要說明的是,重載同樣可以應(yīng)用到父類與子類當(dāng)中。即子類重載了父類的方法。
重寫:
在 VB.NET 中,重寫汲及到的關(guān)鍵字有:
OverRidable: 在父類中聲明的可以在子類中重寫的方法。
OverRides: 在子類中聲明的要重寫父親中可重寫的方法。
MustOverRide: 在父類中,表示這個(gè)方法必須在子類中重寫。此時(shí),該類必須聲明為抽象類。
NotOverridable: 如果當(dāng)前類還有子類,那么,在其子類中,該方法不允許被重寫。
重載:
在 VB.NET 中,重載用到的關(guān)鍵是 OverLoads。
這里需要說明幾點(diǎn):
1. 對(duì)于在同一類當(dāng)中,一組名稱相同的方法或函數(shù)重載時(shí),可以加關(guān)鍵字 OverLoads 或者不加。但如果其中有一個(gè)方法加上,那同組其它方法也必須加該關(guān)鍵字。
2. 如果該方法是重載父類中的方法。那么必須加 OverLoads 關(guān)鍵字。
3. 如果兩個(gè)同名函數(shù)僅返回類型不相同,則它們不能重載,即必須在參數(shù)上有所不同。
VB.net
Public?Class?父類
End?Class
Public?Class?子類
Inherits?父類
End?Class
總體來說,操作上區(qū)別不大,
都是在一個(gè)空白的窗體上面畫控件,
基本控件總體變化不大,
而且預(yù)設(shè)的控件量很多,
基本上不用再倒入其他什么玩藝兒了……
(.NET 里是沒有 ActiveX 控件這么一說的,大家平起平坐)
可是代碼的變化很大,關(guān)鍵字啊變化都挺大的……
比如,在控件方面,控件的文本屬性都是 Text,而沒有 Caption 這么一說
不過 Value 屬性依然保留。
Form 的 Show 方法被拆成了 Show 和 ShowDialog,顧名思義。
Unload 方法被 Form 的 Close 方法代替。
在對(duì)控件的事件處理方面,VB 6.0 使用方法的名稱來定義事件處理程序,
而在 .NET 中使用 Handles 語(yǔ)句來定義,
并且可以用 AddHandler 來在運(yùn)行時(shí)定義事件處理程序。
在關(guān)鍵字方面,
VB.NET 使用 Class、Module 關(guān)鍵字來標(biāo)記一個(gè)模塊,
就像 Sub、Function 一樣,
而不是以文件區(qū)分,
即一個(gè)文件里能放多個(gè)模塊。
而且 VB.NET 能夠提供完備的 OOP 支持,
較 VB6.0 相比,
可以使用 Inherit 關(guān)鍵字來實(shí)現(xiàn)類的繼承,
因此“基類”、“派生”、“重寫”不再是 C 的專利。
于是又出現(xiàn)了 MyBase 關(guān)鍵字用于表示當(dāng)前實(shí)例(Me)的基類,
在 .NET 里,和“我”有關(guān)的關(guān)鍵字包括:Me、My、MyBase、MyClass。
隨之而來的是與可繼承性有關(guān)的 Overridable、MustInherit、MustOverride、NotInheritable、NotOverridable、Protected,
與繼承相關(guān)的 Inherit、Override 關(guān)鍵字。
另外,VB.NET 支持成員重載,即使用相同的名稱與不同的參數(shù)來區(qū)分不同的成員。
而且,在 .NET 框架中,
有一個(gè)用來將不同的模塊分開的容器,命名空間(Namespace 關(guān)鍵字),使模塊井井有條,減少了命名沖突的發(fā)生。
比如內(nèi)置的各種控件都定義在System.Windows.Forms 命名空間里。
在數(shù)據(jù)類型方面,
在 .NET 框架中,所有的類型(包括繼承自 ValueType 的 String、Integer、作為各種枚舉的基類的Enum類型等)都繼承自 Object 類型,即 Object 取代了 Variant。
而 Object 有一個(gè)很方便的 ToString 函數(shù),在 CStr 不管用的時(shí)候可以用這個(gè)。
而且,在 .NET 中,考慮到程序的性能,
不建議使用后期綁定,例如:
(VB 6.0)
Dim V1 As String, V2 As String
V2 = V1 * 50
在 .NET 中,
如果文件頭部有 Option Strict [On],
或是(建議)在工程設(shè)置里打開這一選項(xiàng),
第二行就會(huì)報(bào)錯(cuò),
因?yàn)?不是適用于 String 的操作符,
而在 VB 6.0里會(huì)自動(dòng)執(zhí)行轉(zhuǎn)換,
如果是在 VB.NET,建議執(zhí)行強(qiáng)制轉(zhuǎn)換:
(VB.NET)
Dim V1 As String, V2 As String
V2 = CStr(CInt(V1) * 50)
同理,
(VB 6.0)
Dim Obj As Object
Set Obj = TextBox1
Obj.Text = “Hello World!”
第三行就會(huì)報(bào)錯(cuò),
因?yàn)?Caption 不是 Object 的屬性,
而是 TextBox 的屬性,
解決方案是,使用早期綁定:
(VB.NET)
TextBox1.Text = “Hello World!”
如果需要,可以使用:
DirectCast(Obj, TextBox).Text = “Hello World!”
與此相關(guān)的新式轉(zhuǎn)換關(guān)鍵字包括 CType、DirectCast、TryCast、CObj
盡管看起來累贅些,
但可以避免過度的隨意性。
由此,許多在 VB 6.0里不是很明朗的東西變得豁然開朗,
比如我們?cè)O(shè)計(jì)的窗體其實(shí)繼承自 Form 類,
而 Form 類又繼承自 Object,因此我們可以使用:
(VB 6.0)
Dim FormInstance As Form
Set FormInstance = New Form1
而不會(huì)報(bào)錯(cuò)。
說到這里,.
NET 不支持默認(rèn)屬性,
即:
(VB 6.0)
Command1 = “Hello World!”
等價(jià)于:
Command1.Caption = “Hello World!”
而在 .NET 中沒有 Set 關(guān)鍵詞:
(VB.NET)
Dim Ctl As Control
Ctl = Command1
只能先說到這里了……
有點(diǎn)多,
總之是 .NET 很強(qiáng)大,
過渡不是沒有可能,
但要多看 MSDN。
在繼承類中添加了空的事件過程,估計(jì)也會(huì)調(diào)用基類事件過程的,也就是兩個(gè)事件過程都會(huì)被調(diào)用??梢栽囋囋诶^承類構(gòu)造函數(shù)中用 RemoveHandler 語(yǔ)句能不能撤銷基類的事件過程的綁定。
另外一般的過程可以用override關(guān)鍵字隱藏基類的同名方法,比如基類調(diào)用的方法被繼承類override重寫后,就會(huì)調(diào)用繼承類的方法了。所以可以把事件處理代碼放在一普通過程中,由事件過程調(diào)用,這樣繼承類可以用空的同名方法覆蓋基類方法了。
在VB.NET的類里,實(shí)現(xiàn)一個(gè)接口的語(yǔ)句是:
implements接口名稱
例如,下面定義一個(gè)車(總稱)的接口,這里的車是各種車的總稱:
Public Interface ICar
Property color() As String
Property speed() As Long
Sub PrintInfo()
End Interface
然后在不同類型的“車”類里實(shí)現(xiàn)它:
Public Class A_Car
Implements ICar
Dim m_color As String, m_speed As Long
Public Property color() As String Implements ICar.color
Get
Return m_color
End Get
Set(ByVal Value As String)
m_color = Value
End Set
End Property
Protected Overrides Sub Finalize()
MsgBox(I was deconstructed!)
End Sub
Public Sub New()
m_color = Red
m_speed = 210
MsgBox(I was constructed!)
End Sub
Public Property speed() As Long Implements ICar.speed
Get
Return m_speed
End Get
Set(ByVal Value As Long)
m_speed = speed
End Set
End Property
Public Sub PrintInfo() Implements ICar.PrintInfo
MsgBox(Color: m_color vbNewLine Speed: m_speed, MsgBoxStyle.Information)
End Sub
End Class
在 Form 的 Load 事件中編寫:
Dim myCar As New A_Car
myCar.PrintInfo()
運(yùn)行之后就創(chuàng)建了一個(gè) A_Car 類的實(shí)例 myCar,然后出現(xiàn)兩個(gè)對(duì)話框,分別說明實(shí)例已經(jīng)創(chuàng)建和汽車的信息。當(dāng)窗體卸載時(shí),這個(gè)類的實(shí)例 myCar 將自動(dòng)銷毀,這時(shí)將出現(xiàn)一個(gè)“I was deconstructed!”的對(duì)話框。
聲明一個(gè)接口時(shí),需要考慮以下幾點(diǎn):
1.接口主體只限于對(duì)方法,索引器以及屬性的聲明;
2.接口成員是隱式公開的,如果對(duì)其顯式指定訪問級(jí)別,就會(huì)出現(xiàn)編譯器錯(cuò)誤;
3.接口中不能包含字段,構(gòu)造函數(shù)和常量等;
4.在接口中不能實(shí)現(xiàn)任何方法,屬性或者索引器;
5.在指定方法時(shí),只需要給出返回類型,名稱和參數(shù)列表,然后分號(hào)結(jié)束。
面向?qū)ο蟮慕涌?/p>
在C++中,一個(gè)類被允許繼承多個(gè)類。但是在Java以后的語(yǔ)言不被允許。
這樣,如果想繼承多個(gè)類時(shí)便非常困難。所以開發(fā)方想出了新辦法:接口。
一個(gè)接口內(nèi),允許包含變量、常量等一個(gè)類所包含的基本內(nèi)容。但是,接口中的函數(shù)不允許設(shè)定代碼,也就意味著不能把程序入口放到接口里。由上可以理解到,接口是專門被繼承的。接口存在的意義也是被繼承。和C++里的抽象類里的純虛函數(shù)是相同的。不能被實(shí)例化。
定義接口的關(guān)鍵字是interface,例如:
publicinterfaceMyInterface{
public void add(int x,int y);
public void volume(int x,int y,int z);
}
繼承接口的關(guān)鍵字是implements,相當(dāng)于繼承類的extends。
需要注意的是,當(dāng)繼承一個(gè)接口時(shí),接口里的所有函數(shù)必須全部被覆蓋。例如:
class Demo implements MyInterface{
public void add(int x,int y){
System.out.println( +(x+y));
}
public void volume(int x,int y,int z){
System.out.println( +(x*y*z));
}
public static void main(String args[]){
Demo d=new Demo();
d.add(10,20);
d.volume(10,10,10);
}
}
輸出結(jié)果:
30
1000
當(dāng)想繼承多個(gè)類時(shí),開發(fā)程序不允許,報(bào)錯(cuò)。這樣就要用到接口。因?yàn)榻涌谠试S多重繼承(,),而類不允許。所以就要用到接口。