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

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

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


Public Sub New()
dSize = Room.GetMother().GetSize() * 0.18
End Sub
Public Function GetSize() As Double
GetSize = dSize
End Function
End Class
''''----------------------------------------------------
Class MyRoom
Inherits Room
Private rd As New Desk()

Public Sub New()
rSize = 100
End Sub
Public Sub Show()
MessageBox.Show("Room Size: " str(rSize))
MessageBox.Show("Desk Size: " str(rd.GetSize()))
End Sub
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()
r.Show()
End Sub
End Class

其对象之建造过程为﹕
Step 1: 指令──
Dim r As New MyRoom()
呼叫MyRoom()建构者New()。它再呼叫Room()建构者New()将Room部分建好。

Step 2: 执行指令──
Private rd As New Desk()
呼叫Desk建构者New()﹐建好Desk子对象。此时会执行指令──
dSize = Room.GetMother().GetSize() * 0.18

Step 3: MyRoom建构者New() 继续将母对象建完成。
此时会执行指令── rSize=100

其中,GetSize()程序会取出rSize 值﹐但那时还未执行rSize=100 指令﹐那来
的rSize 值呢﹖所以出问题了。此程序可能输出如下错误结果﹕
Room Size: 100
Desk Size: 0

如何解决上述问题呢﹖常见方法是﹕

把会出问题的指令﹐从建构者程序中提出来﹐放到另一程序里。

例如下述程序:

''''ex03.bas
Imports System.ComponentModel
Imports System.Drawing
Imports System.WinForms
''''----------------------------------------------------
Class Room
Protected rSize As Double
Shared motherObject As Room

Shared Function GetMother() As Room
GetMother = motherObject
End Function
Public Overridable Sub Create()
motherObject = Me
End Sub
Public Function GetSize() As Double
GetSize = rSize
End Function
End Class

Class Desk
Protected dSize As Double
Public Sub Create()
dSize = Room.GetMother().GetSize() * 0.18
End Sub
Public Function GetSize() As Double
GetSize = dSize
End Function
End Class
''''----------------------------------------------------
Class MyRoom
Inherits Room
Private rd As New Desk()

Public Sub New()
Me.Create()
End Sub
Public Overrides Sub Create()
MyBase.Create()
rSize = 100
rd.Create()
End Sub
Public Sub Show()
MessageBox.Show("Room Size: " str(rSize))
MessageBox.Show("Desk Size: " str(rd.GetSize()))
End Sub
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()
r.Show()
End Sub
End Class

此程序输出:
Room Size: 100
Desk Size: 18

像指令── dSize = Room.GetMother().GetSize() * 0.18﹐已挪到新设的Create()程序里。待母对象完全建好了﹐才会呼叫这Create()程序﹐GetSize() 就能取得正确值了。MyRoom的New()呼叫Create()程序时﹐母子对象皆已建造完成了。Create()内部依人们的习惯来设定对象之值,例如建立母子对象之关系。

如此就不会出问题了。
New()与Create()分离之后,MyRoom类别里的指令:

Class MyRoom
Inherits Room
Private rd As New Desk()

Public Sub New()
Me.Create()
End Sub
........

也能写为:
Class MyRoom
Inherits Room
Private rd As Desk

Public Sub New()
rd = New Desk()
Me.Create()
End Sub

标签:

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

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

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