VB.Net中文教程(6) 母子对象关系(4)

2008-04-10 03:08:00来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


Class Room
Private mother As MyRoom

Public Sub New(ByVal mo As MyRoom)
mother = mo
End Sub
Public Function GetID() As String
GetID = mother.yourID()
End Function
End Class

Class MyRoom
Inherits Room

Public Sub New()
MyBase.New(Me)
End Sub
Public Function yourID() As String
yourID = "VIP888"
End Function
End Class
''''----------------------------------------------------
Public Class Form1
Inherits System.WinForms.Form

Public Sub New()
MyBase.New()
Form1 = Me
''''This call is required by the Win Form Designer.
InitializeComponent()
''''TODO: Add any initialization after the InitializeComponent() call
End Sub
''''Form overrides dispose to clean up the component list.
Public Overrides Sub Dispose()
MyBase.Dispose()
components.Dispose()
End Sub
#Region " Windows Form Designer generated code "
......
#End Region
Protected Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim r As New MyRoom()
MessageBox.Show(r.GetID())
End Sub
End Class

此程序输出﹕
VIP888

MyRoom()建构者New()将Me值给 Room的mother参考。于是mother参考到母对象r。Room类别是MyRoom之父类别﹐但Room之对象却是MyRoom之子对象。

如果将上述Room的指令:

Public Function GetID() As String
GetID = mother.yourID()
End Function

更改为:

Public Function GetID() As String
GetID = Me.yourID() ''''Error!!
End Function

就错了。因为Room类别里没有定义yourID()程序。事实上,VB的继承机制里已经有母对象的参考值了,VB的Overridable机制就是基于它而呼叫到子类别(母对象)的程序的。例如上述程序相当于:

''''ex07.bas
Imports System.ComponentModel
Imports System.Drawing
Imports System.WinForms
''''----------------------------------------------------
Class Room
Public Function GetID() As String
GetID = Me.yourID()
End Function
Public Overridable Function yourID() As String
End Function
End Class

Class MyRoom
Inherits Room

Public Sub New()
MyBase.New()
End Sub
Public Overrides Function yourID() As String
yourID = "VIP888"
End Function
End Class
''''----------------------------------------------------
Public Class Form1
Inherits System.WinForms.Form

Public Sub New()
MyBase.New()
Form1 = Me
''''This call is required by the Win Form Designer.
InitializeComponent()
''''TODO: Add any initialization after the InitializeComponent() call
End Sub
''''Form overrides dispose to clean up the component list.
Public Overrides Sub Dispose()
MyBase.Dispose()
components.Dispose()
End Sub
#Region " Windows Form Designer generated code "
.......
#End Region
Protected Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim r As New MyRoom()
MessageBox.Show(r.GetID())
End Sub
End Class

此程序输出﹕
VIP888

上述ex07.bas比ex06.bas好的地方是:
ex06.bas程序的Room类别里面用到MyRoom的名称。而ex07.bas程序的Room类别里面并没用到MyRoom的名称,因此Room类别可以先设计,MyRoom类别能后来才设计,这是继承机制的目的之一。不过,如果您一定不想用继承与Overridable概念的话,可使用VB的Interface机制来改善ex06.bas程序,如下:

''''ex08.bas
Imports System.ComponentModel
Imports System.Drawing
Imports System.WinForms
''''----------------------------------------------------
Interface IMyRoom
Function yourID() As String
End Interface

Class Room
Private mother As IMyRoom

Public Sub New(ByVal mo As IMyRoom)
mother = mo
End Sub
Public Function GetID() As String
GetID = "RoomID: " mother.yourID()
End Function
End Class

Class MyRoom
Implements IMyRoom
Private base As Room

Public Sub New()
base = New Room(Me)
End Sub
Public Function yourID() As String Implements IMyRoom.yourID
yourID = "VIP888"
End Function
Public Function GetID() As String
GetID = base.GetID()
End Function
End Class
''''----------------------------------------------------
Public Class Form1
Inherits System.WinForms.Form

Public Sub New()
MyBase.New()
Form1 = Me
''''This call is required by the Win Form Designer.
InitializeComponent()
''''TODO: Add any initialization after the InitializeComponent() call
End Sub
''''Form overrides dispose to clean up the component list.
Public Overrides Sub Dispose()
MyBase.Dispose()
components.Dispose()

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:VB.Net中文教程(5)程序多重定义

下一篇:VB.Net中文教程(8) 对象(Object)基本概念