VB中对象的如何实现赋值

LWWANDVB 2000-04-03 10:22:00
我的E-mail: LWWVB@netease.com

本人编程经验:高中时开始自学编程,学过C++,BASIC,数据结构,软件基础等……,是一位很热度的编程狂人。





1. VB函数过程的值传递对象问题。

例:有一个Class1类,声明为:

Public data1 As Integer

Public data2 As Integer



测试程序中有两个过程:

Sub test1 (Byval obj As Class1) ‘值传递参数使用Byval

obj.data1=5 ‘改变参数中的数据

obj.data2=6

End Sub



Sub test2 (Byval obj As Class1)

Dim temp as New Class1



temp.data1=obj.data1

temp.data2=obj.data2



temp.data1=5

temp.data2=6

End Sub



主程序:

Sub Main()

Dim obj1 As New Class1 ‘第一个测试



obj1.data1=111

obj1.data2=222



test1 obj1

Debug.Print obj1.data1,obj1.data2

‘obj1对象的data1显示为5,data2为6,它的属性已改变,值传递对象失败

‘其实我也知道test1中的参数是值传递对象引用,不是值传递对象。

‘本人为解决对于不能值传递对象,采用test2的解决方案

‘第二个测试

Dim obj2 As New Class1

obj2.data1=111

obj2.data2=222



test2 obj2

Debug.Print obj2.data1,obj2.data2

End Sub

‘obj2的属性未改变,这表示值传递对象成功。

‘不过,象test2的方法太麻烦了,值传递对象可不可以象test1中这样简洁?

‘我的解决方案是否最简?



2. 从第一个问题引发出第二个问题,就是对象的复制问题。

如:有一个类型A,有两个变量x,y (都是A类型),

就可以采用 x=y 的赋值语法。此时x变量里的数据完全与y相等。



但是VB的对象就不能用 obj1=obj2 的形式。

只能用 set obj1=obj2 的形式。

但set语句只是把一对象引用指向另一对象引用,不是数据内容的复制。

怎样才能很好实现对象间的复制呢?可不可以用 “=”?



为此,我也想出了一个解决方案:就是在类中加入Copy方法,例:

有一个类ClassA,内容如下:

Public D1 As Integer ‘D1、D2其实为属性,在此简化为公共变量

Public D2 As Integer



Sub Copy (OtherObj As ClassA)

D1=OtherObj.D1

D2=OtherObj.D2

End Copy

…… ……



主程序如下:

Sub Main( )

Dim objA As New ClassA

Dim objB As New ClassA



objA.D1=111

objA.D2=222

objB.Copy objA

End Sub

‘Copy方法减少了两个对象赋值时经常出现的 “=”语句。



但如果ClassA中有私有数据,又没有直接改变此私有数据的属性或方法时

Copy方法就不管用了

例:ClassA中还有一私有数据:

private x As Integer

Copy方法改为:

Sub Copy (OtherObj As ClassA)

D1=OtherObj.D1

D2=OtherObj.D2

x=OtherObj.x ‘此句不能运行,不能存取对象的私有数据

End Copy



又如果ClassA中含有其它对象、很多的私有数据,Copy方法将变得十分复杂,难以维护。

有什么更好的方法处理对象间的复制问题?





望先生请教……
...全文
1432 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Un1 2000-04-04
  • 打赏
  • 举报
回复
注意对象本身是不存在“按值”传递的,即使申明ByVal,也只是在调用过程前自动调用一次Set,然后将其内容传递到过程。

如果要复制一个对象,类似TreeView控件的事件内的Node参数的话,正如你所说,需要将其内容复制到一个New对象。

实现这样的意图一般确实是写一个Public或Friend方法Clone(或Copy).

对于私有数据,你可以把他们全部放在Type类型中,然后使用CopyMemory一次性拷贝。参见:
http://www.csdn.net/expert/TopicView.asp?id=2336
major2 2000-04-03
  • 打赏
  • 举报
回复
在你的对象里添加一个克隆自己的方法,比如叫Clone(x as Class1),在这个方法里面就可以存取自己的私有属性。Clone的大致写法就是
一、生成一个类实例 set x = new class1
二、把自己的所有属性复制一份到x里
还有一种方法就是不要用Class1类型传递参数,而用变体型Variant传递。这样就可以用拷贝内存块的方法复制一编对象了。

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧