[译]Visual Basic 2005在语言上的增强(七)运算符重载和转换运算符

原创 2004年12月30日 22:31:00

在Visual Basic 2005的诸多增强的功能中,运算符的重载是最强大的之一。运算符重载允许在任何数据类型上定义运算符,甚至是对你自己创建的基类型进行运算。

最经典的运算符重载的例子就是定义复数的相加。一个简化了的拥有“+”号重载运算符的Complex类,可能是下面这种形式:
Public Class Complex

    Public Real As Double
    Public Imag As Double

    Public Sub New(ByVal realPart As Double, ByVal imagPart As Double)
        Real = realPart
        Imag = imagPart
    End Sub

    Shared Operator +(ByVal lhs As Complex, ByVal rhs As Complex) As Complex
        Return New Complex(lhs.Real + rhs.Real, lhs.Imag + rhs.Imag)
    End Operator

End Class

现在,我们可以用非常直觉的方式,用“+”号运算符来使两个复数相加:
Dim lhs As Complex = New Complex(2.0, 2.5)
Dim rhs As Complex = New Complex(3.0, 3.5)
Dim res As Complex = lhs + rhs 'res.real = 5.0, res.imag = 6.0

你也可以为你的自定义类型重载转换运算符。如果你试图把上面的res的值按照CType(res, String)转换,你会得到一个编译错误告诉你Complex类无法转换成String。如果考虑使用res.ToString的值的话,你会发现复数值的ToString方法返回的只是它的默认类型名。你可以通过重载CType转换运算符和ToString方法来解决这些问题,就像这样:
Public Shared Narrowing Operator CType(ByVal Value As Complex) As String
    '这里的转换没有特殊的要求,因此也可以把Narrowing关键字改成Widening关键字,涕淌注
    Return Value.Real.ToString & "i" & Value.Imag.ToString
End Operator

'涕淌注:作者原文的这段代码有误,无法实现覆盖基类Object类型的ToString方法!
Public Overrides Function ToString(ByVal Value As Complex) As String
    Return Value.Real.ToString & "i" & Value.Imag.ToString
End Function

'涕淌注:正确的代码如下!
Public Overrides Function ToString() As String
    Return Real.ToString & "i" & Imag.ToString
End Function

现在CType(res, String)和res.ToString的返回值就和我们想要的一样了:“5.0i6.0”(实际得到的是“5i6”,Visual Basic把最后的点零省略了,涕淌注)。转换运算符声明时必须要么被Narrowing修饰,要么被Widening修饰,以此来说明转换的性质。

@以下是原文供大家参考@

Operator Overloading and Conversion Operators

One of the most powerful additions to Visual Basic 2005 is operator overloading. Operator overloading lets you define operators that act on any type you want, even to the point of creating your own base types.

The classic operator-overloading example is adding complex numbers. A simplified Complex class with the + operator overloaded might look like this:
Public Class Complex

    Public Real As Double
    Public Imag As Double

    Public Sub New(ByVal realPart As Double, ByVal imagPart As Double)
        Real = realPart
        Imag = imagPart
    End Sub

    Shared Operator +(ByVal lhs As Complex, ByVal rhs As Complex) As Complex
        Return New Complex(lhs.Real + rhs.Real, lhs.Imag + rhs.Imag)
    End Operator

End Class

Use the + operator to add complex numbers in a very intuitive way:
Dim lhs As Complex = New Complex(2.0, 2.5)
Dim rhs As Complex = New Complex(3.0, 3.5)
Dim res As Complex = lhs + rhs 'res.real = 5.0, res.imag = 6.0

You can also overload conversion operators for your custom types. If you try to convert the value of res as CType(res, String), you'll get a compiler error Complex cannot be converted to String." If you try looking at the value of res.ToString, you get a value of Complex back as ToString shows the type name by default. You fix these issues by overloading the CType conversion operator and the ToString method, like so:
Public Shared Narrowing Operator CType(ByVal Value As Complex) As String
    Return Value.Real.ToString & "i" & Value.Imag.ToString
End Operator

Public Overrides Function ToString(ByVal Value As Complex) As String
    Return Value.Real.ToString & "i" & Value.Imag.ToString
End Function

Now the returned values of CType(res, String) and res.ToString are what you would expect: "5.0i6.0." Conversion operators must be declared with either Narrowing or Widening, indicating how the conversion is done.

Visual Basic快捷教程——函数与子程序

函数是结构化程序设计的基础。函数的本质就是为了把程序切分成若干个相对独立的模块各司其职,而各个函数的作用也就是仅仅专门负责自己份内的那份功能。在Visual Basic中,函数是一组以Function...
  • baimafujinji
  • baimafujinji
  • 2017年04月19日 22:30
  • 3115

[译]Visual Basic 2005在语言上的增强(六)IsNot运算符和TryCast语句

友情提醒,本文翻译的一处有误,请网友们务必结合评论来看本期翻译!IsNot运算符IsNot是Is的反义运算符。在引用一个对象前,要先检查它是否已被初始化,而在过去我们都使用这种很别扭很老套的方式:If...
  • GnuDoyng
  • GnuDoyng
  • 2004年12月27日 18:39
  • 3552

[译]Visual Basic 2005在语言上的增强(十二)默认实例和编译器警告

默认实例另一个对Visual Basic .NET的改变就是窗体的默认实例,不少从Visual Basic 6.0转向.NET开发的人员因为找不到窗体的默认实例而感到困惑。你必须在使用一个窗体对象时先...
  • GnuDoyng
  • GnuDoyng
  • 2005年01月18日 20:42
  • 2782

Visual Basic 2005程序设计实例教程(奋斗的小鸟)_PDF 电子书

Visual Basic 2005程序设计实例教程(奋斗的小鸟)
  • tjoy2005
  • tjoy2005
  • 2013年10月11日 13:02
  • 1105

运算符重载之转换运算符

我们知道c++中,cout
  • q__y__L
  • q__y__L
  • 2016年04月11日 10:33
  • 574

全面理解C#中的重载运算符和转换运算符

大家很少用的原因其中一个是因为写程序的时候都是用dataset datatable来保存数据,并没有构建自己的数据类,这样实现功能起来虽然很方便,但是灵活度就不够了,一直就限制在线性表的操作。2005...
  • shanliwa
  • shanliwa
  • 2007年10月23日 11:50
  • 695

[译]Visual Basic 2005在语言上的增强(五)Using、Continue语句及Global关键字

Using语句Using语句是获取一个对象、执行代码、并迅速地释放对象的捷径。框架(指.NET Framework,涕淌注)下有很多的对象,譬如graphics、file handles、commun...
  • GnuDoyng
  • GnuDoyng
  • 2004年12月26日 03:16
  • 3769

[译]Visual Basic 2005在语言上的增强(十三)显式的数组范围及小结

显式的数组范围你现在可以使用显式的数组范围来声明数组,这样的声明更加清晰可读了:Dim a(10) As Integer 旧方式Dim b(0 To 10) As Integer 新方式Visual ...
  • GnuDoyng
  • GnuDoyng
  • 2005年01月19日 15:53
  • 2492

[译]Visual Basic 2005在语言上的增强(二)My

从Visual Basic 6.0甚至是更早版本迁移到.NET平台下的开发人员所面临的一个主要挑战就是.NET框架本身庞大的规模及其命名空间层次中繁多的类。经常使用的应用程序以及环境变量都可以在.NE...
  • GnuDoyng
  • GnuDoyng
  • 2004年12月20日 12:12
  • 3350

[译]Visual Basic 2005在语言上的增强(十)应用程序级别事件

另一个令你垂涎的新特性是这套崭新出炉的应用程序级别事件,你在一系列名为MyApplication的部分类中可以找到它。你可以在解决方案资源管理器中查找My Project项目中的一个名为MyEvent...
  • GnuDoyng
  • GnuDoyng
  • 2005年01月12日 21:53
  • 2829
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[译]Visual Basic 2005在语言上的增强(七)运算符重载和转换运算符
举报原因:
原因补充:

(最多只允许输入30个字)