装配中的脑袋

用程序装配大脑,再用大脑装配程序
随笔 - 118, 评论 - 1214, 引用 - 11

导航

工具

关于

如果想发较大的信件,请用Ninputer @ gmail.com

不要在我的Blog评论中张贴广告,除非同意向我付款。

标签

每月存档

广告



访客

 

关键词:VB2005 VB8.0 VB.NET Whidbey

从本篇起,我会花几篇贴子讨论这个Visual Basic 2005中引入的重大功能——运算符重载。运算符重载是一项很有趣的功能,使用它可以给自己的类型定义运算符。比如我们常常遇到两个对象“相加”的概念,比如两个矩阵的相加,两个集合相加等等,如果没有运算符重载,我们是用对象的方法来执行这类操作的。比如A和B是具有可相加概念的两个对象,那么传统的方法是提供一个“Add”方法:

A.Add(B)
'或者用A、B所属类型T的一个静态方法
T.Add(A, B)

这样的操作当需要频繁使用各种运算时就会变得复杂和难以理解,比如A + B - C + D就得表示成

A.Add(B).Subtract(C).Add(D)
'或者用A、B、C和D所属类型T的静态方法表示
T.Add(T.Subtract(T.Add(A, B), C), D)

无论那种写法都非常的难看而且冗长。如果我们可以直接使用+或-这样的运算符多好。现在,运算符重载使这个愿望成真了。

Visual Basic 2005中运算符重载的本质是类的一组公共静态方法,每个可以重载运算符都有一个名称,比如二元运算符+号的名称是op_Addition。要注意的是,运算符重载这一特征是不符合公共语言规范(CLS)的,因为大部分语言不支持运算符重载。即使支持运算符重载的主流.NET语言(如C#、Delphi)可重载的运算符与VB支持重载的运算符也不完全相同,因此重载运算符会带来跨语言的障碍。另一个要注意的问题是,重载后运算符的意义应当和运算符原来的意义相似,这也是尽量减少跨语言障碍的规则之一,比如VB和C#的移位运算符都是<<和>>,而Delphi的则是Shl和Shr,如果重载移位运算符用做向流中添加对象(就像C++那样),那么在Delphi中使用该运算符的语法将变得不可理解。以下表格对比了Visual Basic和C#各自支持重载的运算符:

Visual Basic C# 运算符的名称
+(一元) +(一元) op_UnaryPlus
-(一元) -(一元) op_UnaryNegation
IsTrue true op_True
IsFalse false op_False
(无此运算符) ! op_LogicalNot
Not ~ op_OnesComplement
(无此运算符) ++ op_Increment
(无此运算符) -- op_Decrement
+ + op_Addition
- - op_Subtraction
* * op_Multiply
/ / op_Division
\ (无此运算符) op_IntegerDivision
& (无此运算符) op_Concatenate
^ (无此运算符) op_Exponent
<< << op_LeftShift
>> >> op_RightShift
=(判断等值而不是赋值) == op_Equality
<> != op_Inequality
< < op_LessThan
<= <= op_LessThanOrEqual
> > op_GreaterThan
>= >= op_GreaterThanOrEqual
And & op_BitwiseAnd
Or | op_BitwiseOr
Xor ^ op_ExclusiveOr
Mod % op_Modulus
Like (无此运算符) op_Like
CType (用户定义的类型转换) op_Explicit和op_Implicit

从这个表可以清楚地看出Visual Basic所支持重载的所有运算符以及Visual Basic与C#支持的运算符中不兼容的部分。

本篇首先介绍普通二元运算符,包括+、-、*、/、\、Mod、&、^、And、Or、Xor、<<、>>和Like。这些运算符重载的语法是:

<attributes> Public Shared Operator OpSymbol(LeftArg, RightArg)As ReturnType

其中LeftArg和RightArg中至少有一个必须是定义运算符的类型,否则将可能会重载定义在别的类型上的运算符。这种普通运算符对返回类型一般没有要求,但建议根据运算符的意义而定。比如&运算符通常返回字符串而Like运算符通常返回布尔型变量。下面的例子展示了重载一个向量结构的+运算符,以便进行两个向量和的运算:

Public Structure MathVector
    Public x, y, z As Double

    Public Sub New(initX As Double, initY As Double, initZ As Double)
        x = initX
        y = initY
        z = initZ
    End Sub

    Public Shared Operator +(left As MathVector, right As MathVector) _
        As MathVector

        Return New MathVector(left.x + right.x, _
                              left.y + right.y, _
                              left.z + right.z)
   
End Operator
End Structure

这些运算中的+、-、*、/、\、<<、>>、^等运算符隐含了对赋值运算符的重载,比如重载了+就相当于重载了+=运算符,但是不能直接重载赋值运算符。普通二元运算符重载非常容易,也最为常用。下次我们讨论一元运算符和比较运算符。


随贴广告(测试期)
相关文章

打印 | 张贴于 2004-06-05 22:10:00 | Tag:技术随笔  Visual Basic 2005 新功能点评

留言反馈

回复: Visual Basic 2005新功能点评(六)——运算符重载 part.1 编辑
任何语言都是要发展的嘛。
2004-06-11 16:51:00 | [匿名用户:Wayne_Deng]
回复: Visual Basic 2005新功能点评(六)——运算符重载 part.1 编辑
当然,VB2005的设计目标之一就是加快50%的开发速度
2004-06-07 23:04:00 | [匿名用户:Ninputer]
回复: Visual Basic 2005新功能点评(六)——运算符重载 part.1 编辑
我衹知道vb6的優勢是快速開發! 不知道現在的vb還有沒有這個優勢~
2004-06-07 22:06:00 | [匿名用户:ashuai]
回复: Visual Basic 2005新功能点评(六)——运算符重载 part.1 编辑
VBNET不断地加入了其它语言的特性,VBNET的功能是越来越强大了,可不知VBNET在那点上体现其独有的特点,除RAD外,如C++在系统级和硬件驱动开发上有优势,DELPHI在数据库方面有优势,JAVA在网络开发上有优势,那么VBNET将在那些方面体现优势呢?根据你的信息VBNET有没有可能同时具备以上语言所有的功能,如果真是这样那就太好了!!!
2004-06-07 17:03:00 | [匿名用户:zjh135]
回复: Visual Basic 2005新功能点评(六)——运算符重载 part.1 编辑
从理论上说,VB支持运算符重载和VB支持While语句一样正常。
VB也不是只有从别的语言抄来的东西,比如我将介绍的My就是这样一个特征。
2004-06-07 11:52:00 | [匿名用户:Ninputer]
回复: Visual Basic 2005新功能点评(六)——运算符重载 part.1 编辑
你真的还认为这是VB吗?呵呵

C#也好,VB.NET也好,不过是两个马甲而已 :P
2004-06-07 10:28:00 | [匿名用户:Flier Lu]
博客主人设置本博客不允许匿名用户发表言论,请登录后再试

Powered by: Joycode MVC Blogger System