试图学习多态性等在VB6,但我的代码没有做什么,我希望它(Attempting to learn p

2019-06-26 08:19发布

以下是我已经有了一个命令按钮; 它只是创建变量,并试图输出其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

Modeul1.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)的事实,即球和Cube类仅包含 BaseObj类型的对象。 他们实际上并没有沿用BaseObj任何东西; 他们只是被迫实现相同的接口(whoopty斗。)

更糟糕的是,这是我真正希望是可求的一个,他们似乎并不能够填补基类的一个对象,当涉及到参数的传递。

难道我做错了什么?

Answer 1:

你已经找到了如何修正这个错误,但我会作出贡献的“为什么”。

在VB6(和VB5等),有两种语法用于调用一个方法/功能/子程序/语句。 首先是这样的:

MySubName arg1, arg2, arg3, arg4

布莱什,我知道它是从C和Java我的偏见,但我喜欢看我的周围参数列表括号。 这是语法时才这样:

Call MySubName(arg1, arg2, arg3, arg4)

所以这两个是equivilent。

你跑进不是通话的效果。 你跑进是在非通话版不需要的括号的效果。 括号内强制他们精氨酸声明/的声明(想操作的数学顺序)的其余部分之前进行评估。

所以这:

SomeSub (arg1)

是这样的:

temp = (arg1) 
SomeSub temp

此外,在VB6对象可以有一个“默认属性”。 这让你写这样的代码:

Dim name as String
name = txtName

取而代之的assigne文本框对象引用名,。文本的默认属性被使用,其结果是这样的:

Dim name as String
name = txtName.Text

所以,当你试图评估SomeSub (arg1)我认为它会尝试查找并执行你的对象的默认属性,并传递价值SomeSub



Answer 2:

Visual Basic 6的不与学习OOP的“更纯”的形式理想语言。 VB6的目的是要实现一个非常杂交版本的基于对象的编程是绕行Microsoft组件对象模型(COM)的世界里,与它的接口继承定向。 VB6不支持实现继承,这可能会使您正在寻找很难做到的那种多态性。

有几个窍门我从VB6时代“避开”(在某种程度上)的实现继承的问题,尤其是当它涉及到代基类的一个对象的一个​​子类回忆。 一招我记得是声明的基本接口返回提到“我”作为返回类型的类型的属性过程。 这种“招数”运行到提供转换成所需的接口。 还有一个魔术在VB6的设计对话框之一的“程序号”设置为-4作出财产“defaut”属性。

点? 如果你真的想进入传统的面向对象编程,不要试图用VB6学习它,如果你没有。 向上移动到(至少)VB.NET,C#或Java。 我不说,作为一个VB6劲敌 - 赫克,知道这些愚蠢的细节付出了很长时间的法案 - 但其难啃的骨头给自己的小特质转化为OOP的一个很好的,基本的了解。

祝好运!



Answer 3:

好吧,我想通了,排序的。

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 MsgBoxTheID (ball1)  'errors; should be 0
Call MsgBoxTheID (ball2)  'errors; should be 3
Call MsgBoxTheID (cube1)  'errors; should be 1
Call MsgBoxTheID (cube2)  'errors; should be 2

......即使MsgBoxTheID没有返回类型,这是奇怪,因为我一直以为Call是简单的东西,你可以用它来丢弃的返回值,而不必声明一个变量,就像这样:

dim unneededVar as Integer
unneededVar = FunctionNameThatReturnsAnInteger()

但我想不会。 所以......我得去正是读了Call语句做使这个示例程序的工作,但它现在可以肯定的工作。 (我也不得不加BaseObj_ID = theObj.IDProperty Get BaseObj_ID() As Integer在正在执行的类方法BaseObj 。)



文章来源: Attempting to learn polymorphism, etc. in VB6, but my code doesn't do what I want it to