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方法将变得十分复杂,难以维护。

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





望先生请教……
...全文
1329 2 打赏 收藏 转发到动态 举报
写回复
用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传递。这样就可以用拷贝内存块的方法复制一编对象了。
第一部分 Visual Basic.net基础 1.vb. net介绍 2.vb.net的优点 3.新建一个vb.net项目 4.编写第一个vb.net应用程序 第二部分 vb.net的语法部分 1.vb.net的Numeric数据类型 2.vb.net的Byte数据类型 3.vb.net的String数据类型 4.vb.net的Boolean数据类型 5.vb.net的Date数据类型 6.vb.net的Object数据类型 7.vb.net的用户自定义类型 8.vb.net的数组定义 9.vb.net的数组列表 10.vb.net的多维数组 11.vb.net类型转换函数 第三部分 visual basic.net的运算 程序设计时经常用到的有6种运算:算术运算(Arithmetic)、赋值运算(Assignment)、二进制运算(Bitwise)、比较运算(Comparison)、连接运算(concatenation)及逻辑运算(Logical),下面对这6种运算进行简单介绍。 1.vb.net的算术运算 2.vb.net的赋值运算符 3.vb.net的二进制运算符 4.vb.net的比较运算符 5.vb.net的连接运算符和逻辑运算符 6.vb.net运算符的优先级 (一) Visual basic.net的常量和变量 1.vb.net的常量 2.vb.net的变量 (二) Visual basic.net的流程和控制结构 1.vb.net条件分支语句 2.vb.net的循环语句 (三) vb.net的过程和函数 1.vb.net的Sub过程 2.vb.net的Funtion过程 3.在vb.net调用过程 4.如何向过程传递参数 (四)vb.net的类和对象基础 第四部分 visual basic.net的常用控件 1.vb.net的Label控件 2.vb.net的Button控件 3.vb.net的Textbox控件 4.vb.net的MainMenu控件 5.vb.net的Checkbox控件 6.vb.net的Radiobutton控件 7.vb.net的GroupBox控件 8.vb.net的PictureBox控件 9.vb.net的ListBox控件 10.vb.net的CheckedListBox控件 11.vb.net的Combobox控件 12.vb.net的ListView控件 13.vb.net的TreeView控件 14.vb.net的ImageList控件 15.vb.net的Timer控件 16.vb.net的HScrollBar和VScrollBar控件 17.vb.net的ProgressBar控件 18.vb.net的ToolBar控件 19.vb.net的StatusBar控件 20.Vs 2005的ToolStrip控件 21.Vs 2005的StatusStrip控件 22.Vs 2005的MenuStrip控件 第六部分 vb.net的OOP结构 1.什么是oop 2.vb.net的面向对象性 3.vb.net的共享成员(Share Members) 4.类模块和标准代码模块的区别和比较 5.对象浏览器 (一) 建立和使用对象 1.vb.net对象的建立和销毁:对象的生命周期 2.设置和重设vb.net的属性 3.用方法来表现动作 4.vb.net对象变量的声明 5.对一个对象进行多种操作 6.使用New关键字 7.如何释放对对象的引用 8.如何把对象传递到一个过程 (二) 在程序运行得到一个类的信息: 用一个字符名称调用一个属性或者方法 (三) vb.net的类、继承与多态性 1.vb.net给一个类添加方法 2.命名属性、方法和事件 3.vb.net的事件和事件处理 4.类的继承(Inheritance) 5.vb.net继承的规则 6.用继承建立一个继承类 7.重载Windows控件 8.什么时候使用继承 9.什么是命名空间(Namespace) 10.vb.net继承的例子 11.vb.net用继承实现多态性 12.vb.net用接口实现多态性 第七部分 数据库访问技术 关于SQL语言的知识,请参考: sql语言教程及Sql语言基础 1.数据库基础知识 2.vb.net数据集(Datasets)的概念 3.什么是dao 4.Dao与Jet数据库引擎 5.Dao对象模型 6.远程数据对象RDO 7.Rdo对象模型 8.odbc api是什么 9.ODBC的结构 10.使用ODBC API访问数据库 11.ado数据对象 12.ado对象模型 13.ADO.NET简介 14.使用ADO.NET的基本方法 第八部分 vb.net的多线程 1.自由线程(Free Threading) 2.关于线程的参数和返回值的问题 3.vb.net的并发性问题 第九部分 vb.net的文件和出错处理 1.vb.net的出错处理 2.vb.net的多种出错处理(Multiple Exceptions) 3.vb.net的文件对象(file object) 4.vb.net文件处理的出错处理 5.检测文件的结束(Testing for End of File) 6.文件的静态方法(Static File Methods)
在工程实践经常需要实现上下位机间的串口通信,为了编程的方便性我们通常采用字符方式进行数据传输,由于需要数据转换以及转换后的数据长度增加,数据传输速度不够理想,为了提高系统实时性在某些特殊场合更需要直接采用二进制进行数据传输。Delphi6.0是一种面向对象的可视化的快速应用开发(RAD)工具,它既具有C++语言的强大功能,同时又有VB的易用性,Delphi6.0的伸缩性强,既可用于开发小项目,也可用于开发大项目,尤其适用于快速应用的开发,其大量优点使它迅速成为一种非常流行的编程语言。Delphi6.0串口通信的实现方法很多,可以使用嵌入式汇编语言、API函数以及VB的MSComm控件来实现。其使用MSComm控件来实现串口通信最方便,但有关Delphi如何实现二进制通信的资料很少,大部分参考书都只介绍了VBMSComm控件的字符通信方式。由于Delphi数组跟Variant变量不兼容,即在Delphi字节数组不能直接赋值给MSComm控件的output属性,这跟VB很大的不同(VB可以直接赋值),本人通过摸索总结出两种实现Delphi二进制通信的方法,即动态数组法和可变数组(Variant Array)法,并给出了应用实例。在应用实例我们使用Delphi的absolute关键字来定义两个同地址的动态数组,类型分别为字节型数组和短整型数组,使用字节动态数组接收数据后,可以直接使用短整型动态数组获得短整型数据,省却了数据转换的麻烦

7,763

社区成员

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

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