gpt4 book ai didi

vb6 - 尝试在 VB6 中学习多态性等,但我的代码没有按照我的意愿进行

转载 作者:行者123 更新时间:2023-12-02 07:40:39 25 4
gpt4 key购买 nike

这是我在命令按钮上得到的;它只是创建变量并尝试输出它们的 ID(这应该是从基类继承的实例变量。)

Private Sub Command1_Click()
Dim ball1 As Ball, ball2 As Ball
Dim cube1 As Cube, cube2 As Cube

Set ball1 = New Ball
Set cube1 = New Cube
Set cube2 = New Cube
Set ball2 = New Ball

MsgBoxTheID (ball1) 'errors; should be 0
MsgBoxTheID (ball2) 'errors; should be 3
MsgBoxTheID (cube1) 'errors; should be 1
MsgBoxTheID (cube2) 'errors; should be 2

Call ball1.MsgBoxID ' works; displays 0
Call ball2.MsgBoxID ' works; displays 3
Call cube1.MsgBoxID ' works; displays 1
Call cube2.MsgBoxID ' works; displays 2

End Sub

模型1.bas:

Global globalID As Integer

Public Sub MsgBoxTheID(theObj As BaseObj)
' this function is meant to accept objects of type Ball, Cube, and BaseObj
MsgBox theObj.ID
End Sub

BaseObj 类模块:

Public ID As Integer
Public isVisible As Boolean

Public Sub setVisiblity(newVis As Boolean)
isVisible = newVis
End Sub

Public Sub MsgBoxID()
MsgBox ID
End Sub

Private Sub Class_Initialize()
ID = globalID
globalID = globalID + 1
End Sub

球类模块:

Implements BaseObj
Private theObj As BaseObj
Public radius As Double

Private Property Let BaseObj_ID(ByVal RHS As Integer)
End Property
Private Property Get BaseObj_ID() As Integer
End Property
Private Property Let BaseObj_isVisible(ByVal RHS As Boolean)
End Property
Private Property Get BaseObj_isVisible() As Boolean
End Property

Public Sub MsgBoxID()
Call theObj.MsgBoxID
End Sub

Private Sub BaseObj_MsgBoxID()
Call theObj.MsgBoxID
End Sub

Public Sub BaseObj_setVisiblity(newVis As Boolean)
End Sub

Private Sub Class_Initialize()
Set theObj = New BaseObj
End Sub

立方体类模块:

Implements BaseObj
Private theObj As BaseObj
Public sideLength As Double

Private Property Let BaseObj_ID(ByVal RHS As Integer)
End Property
Private Property Get BaseObj_ID() As Integer
End Property
Private Property Let BaseObj_isVisible(ByVal RHS As Boolean)
End Property
Private Property Get BaseObj_isVisible() As Boolean
End Property

Public Sub MsgBoxID()
Call theObj.MsgBoxID
End Sub

Private Sub BaseObj_MsgBoxID()
Call theObj.MsgBoxID
End Sub

Public Sub BaseObj_setVisiblity(newVis As Boolean)
End Sub

Private Sub Class_Initialize()
Set theObj = New BaseObj
End Sub

有几件事我不喜欢这个,其中两件事我的印象是不可避免的:(1)与 C++ 相比它是一团糟的事实,以及(2)Ball 和 Cube 的事实类仅包含 BaseObj 类型的对象。他们实际上并没有从 BaseObj 继承任何东西;他们只是被迫实现相同的接口(interface)(whoopty doo。)

更糟糕的是,这是我真正希望可以纠正的问题,在参数传递方面,它们似乎无法填充基类的对象。

我做错了什么吗?

最佳答案

Visual Basic 6 不是学习“更纯粹”形式的 OOP 的理想语言。 VB6 旨在实现基于对象的编程的高度混合版本,该版本以 Microsoft 组件对象模型 (COM) 世界为中心,以其接口(interface)继承 为导向。 VB6 不支持实现 继承,这往往会使您正在寻找的那种多态性难以实现。

我记得 VB6 时代有一些技巧可以“绕过”(某种程度上)实现继承问题,尤其是在用基类的对象替换子类时。我记得的一个技巧是声明一个基接口(interface)类型的属性过程,该过程返回对“Me”的引用作为返回类型。这“欺骗”运行时提供到所需接口(interface)的转换。通过在 VB6 的一个设计对话框中将属性的“过程编号”设置为 -4,还有另一个魔术可以使属性成为“默认”属性。

重点是什么?如果您真的想接触传统的 OO 编程,如果没有必要,请不要尝试使用 VB6 来学习它。升级到(至少)VB.NET、C# 或 Java。作为一个 VB6 的仇恨者,我并不是这么说的——见鬼,知道这些愚蠢的细节已经支付了很长时间的账单——但要将它自己的小特质转化为对 OOP 的良好、基本的理解是一个棘手的问题。

祝你好运!

关于vb6 - 尝试在 VB6 中学习多态性等,但我的代码没有按照我的意愿进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11515724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com