VB.Net中文教程(6) 母子对象关系(2)
2008-04-10 03:08:00来源:互联网 阅读 ()
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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
