当前位置: 首页 > 教程 > VB.Net >

VB.类和对象

精华
小牛编辑
153浏览
2023-03-14

当定义一个类时,就定义了一个数据类型的蓝图(或模板)。这实际上并没有定义任何数据,但它确实定义了类名和含义,即该类的一个对象将包含哪些内容以及可以在这样的对象上执行哪些操作。

对象是一个类的实例。构成类的方法和变量被称为类的成员。

类定义

类定义以关键字Class开头,后面跟着类名和类体,并以End Class语句结束。 以下是类定义的一般形式:

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ MustInherit | NotInheritable ] [ Partial ] _
Class name [ ( Of typelist ) ]
    [ Inherits classname ]
    [ Implements interfacenames ]
    [ statements ]
End Class

其中,

  • attributelist 是适用于该类的属性列表,这是一个可选项。
  • accessmodifier 定义了该类的访问级别,它的值有 - Public, Protected, Friend, Protected FriendPrivate,这是一个可选项。
  • Shadows 指示该变量在基类中重新声明并隐藏了一个相同名称的元素或一组重载元素,这是一个可选项。
  • MustInherit 指定该类只能用作基类,并且不能直接从它创建对象,即抽象类,这是一个可选项。
  • NotInheritable 指定该类不能用作基类。
  • Partial 表示该类的定义部分。
  • Inherits 指定它所继承的基类。
  • Implements 指定类继承的接口。

下面的例子演示了一个Box类,它有三个数据成员,分别是:length, breadthheight

Module mybox
   Class Box
      Public length As Double   ' Length of a box '
      Public breadth As Double   ' Breadth of a box '
      Public height As Double    ' Height of a box '
   End Class
   Sub Main()
      Dim Box1 As Box = New Box()        ' Declare Box1 of type Box '
      Dim Box2 As Box = New Box()        ' Declare Box2 of type Box '
      Dim volume As Double = 0.0     ' Store the volume of a box here '
      ' box 1 specification '
      Box1.height = 5.0
      Box1.length = 6.0
      Box1.breadth = 7.0
       ' box 2 specification '
      Box2.height = 10.0
      Box2.length = 12.0
      Box2.breadth = 13.0
      'volume of box 1 '
      volume = Box1.height * Box1.length * Box1.breadth
      Console.WriteLine("Volume of Box1 : {0}", volume)
      'volume of box 2 '
      volume = Box2.height * Box2.length * Box2.breadth
      Console.WriteLine("Volume of Box2 : {0}", volume)
      Console.ReadKey()
   End Sub
End Module

执行上面示例代码,得到以下结果 -

F:\worksp\vb.net\classes_objects>vbc mybox.vb
Microsoft (R) Visual Basic Compiler version 14.0.1038
for Visual Basic 2012
Copyright (c) Microsoft Corporation.  All rights reserved.
......
F:\worksp\vb.net\classes_objects>mybox.exe
Volume of Box1 : 210
Volume of Box2 : 1560

成员函数和封装

一个类的成员函数是一个函数,它在类定义中具有其定义或原型,就像任何其他变量一样。 它在它所属的类的任何对象上运行,并且可以访问该对象的类的所有成员。

成员变量是一个对象的属性(从设计的角度来看),它们是保密的,以实现封装。 这些变量只能使用公共成员函数来访问。

让我们来看看上面的概念设置和获得不同类成员的值:

Module MemberFunctions
   Class Box
      Public length As Double   ' Length of a box '
      Public breadth As Double   ' Breadth of a box'
      Public height As Double    ' Height of a box'
      Public Sub setLength(ByVal len As Double)
          length = len
      End Sub
      Public Sub setBreadth(ByVal bre As Double)
          breadth = bre
      End Sub
      Public Sub setHeight(ByVal hei As Double)
          height = hei
      End Sub
      Public Function getVolume() As Double
          Return length * breadth * height
      End Function
   End Class
   Sub Main()
      Dim Box1 As Box = New Box()        ' Declare Box1 of type Box'
      Dim Box2 As Box = New Box()        ' Declare Box2 of type Box'
      Dim volume As Double = 0.0     ' Store the volume of a box here'

     ' box 1 specification'
      Box1.setLength(6.0)
      Box1.setBreadth(7.0)
      Box1.setHeight(5.0)

      'box 2 specification'
      Box2.setLength(12.0)
      Box2.setBreadth(13.0)
      Box2.setHeight(10.0)

      ' volume of box 1'
      volume = Box1.getVolume()
      Console.WriteLine("Volume of Box1 : {0}", volume)

      'volume of box 2'
      volume = Box2.getVolume()
      Console.WriteLine("Volume of Box2 : {0}", volume)
      Console.ReadKey()
   End Sub
End Module

执行上面示例代码,得到以下结果 -

F:\worksp\vb.net\classes_objects>vbc MemberFunctions.vb
Microsoft (R) Visual Basic Compiler version 14.0.1038
for Visual Basic 2012
Copyright (c) Microsoft Corporation.  All rights reserved.
F:\worksp\vb.net\classes_objects>MemberFunctions.exe
Volume of Box1 : 210
Volume of Box2 : 1560

构造函数和析构函数

一个类的构造函数是一个类的特殊成员子程序,每当创建这个类的新对象的时候构造函数就会被执行。一个构造函数名称为:New,它没有任何返回类型。

以下程序演示了构造函数的概念和使用:

Module MemberFunctions
   Class Box
      Public length As Double   ' Length of a box '
      Public breadth As Double   ' Breadth of a box'
      Public height As Double    ' Height of a box'
      Public Sub setLength(ByVal len As Double)
          length = len
      End Sub
      Public Sub setBreadth(ByVal bre As Double)
          breadth = bre
      End Sub
      Public Sub setHeight(ByVal hei As Double)
          height = hei
      End Sub
      Public Function getVolume() As Double
          Return length * breadth * height
      End Function
   End Class
   Sub Main()
      Dim Box1 As Box = New Box()        ' Declare Box1 of type Box'
      Dim Box2 As Box = New Box()        ' Declare Box2 of type Box'
      Dim volume As Double = 0.0     ' Store the volume of a box here'

     ' box 1 specification'
      Box1.setLength(6.0)
      Box1.setBreadth(7.0)
      Box1.setHeight(5.0)

      'box 2 specification'
      Box2.setLength(12.0)
      Box2.setBreadth(13.0)
      Box2.setHeight(10.0)

      ' volume of box 1'
      volume = Box1.getVolume()
      Console.WriteLine("Volume of Box1 : {0}", volume)

      'volume of box 2'
      volume = Box2.getVolume()
      Console.WriteLine("Volume of Box2 : {0}", volume)
      Console.ReadKey()
   End Sub
End Module

执行上面示例代码,得到以下结果 -

F:\worksp\vb.net\classes_objects>vbc Line.vb
Microsoft (R) Visual Basic Compiler version 14.0.1038
for Visual Basic 2012
Copyright (c) Microsoft Corporation.  All rights reserved.
......
F:\worksp\vb.net\classes_objects>Line.exe
Object is being created
Length of line : 6

默认的构造函数没有任何参数,但是如果需要的话,构造函数可以有参数。这样的构造函数被称为参数化的构造函数。这种技术可以在创建对象时将初始值赋值,如以下示例所示:

Class Line2
   Private length As Double    ' Length of a line '
   Public Sub New(ByVal len As Double)   'parameterised constructor '
      Console.WriteLine("Object is being created, length = {0}", len)
      length = len
   End Sub
   Public Sub setLength(ByVal len As Double)
      length = len
   End Sub

   Public Function getLength() As Double
      Return length
   End Function
   Shared Sub Main()
      Dim line As Line2 = New Line2(199.0)
      Console.WriteLine("Length of line set by constructor : {0}", line.getLength())
      'set line length '
      line.setLength(68.0)
      Console.WriteLine("Length of line set by setLength : {0}", line.getLength())
      Console.ReadKey()
   End Sub
End Class

执行上面示例代码,得到以下结果 -

F:\worksp\vb.net\classes_objects>vbc Line2.vb
Microsoft (R) Visual Basic Compiler version 14.0.1038
for Visual Basic 2012
Copyright (c) Microsoft Corporation.  All rights reserved.
......
F:\worksp\vb.net\classes_objects>Line2.exe
Object is being created, length = 199
Length of line set by constructor : 199
Length of line set by setLength : 68

析构函数是一个类的特殊成员子程序(Sub),只要它的类的一个对象超出了作用域就会被执行。

析构函数名称为Finalize,它既不能返回值也不能带任何参数。在关闭文件,释放内存等程序出来之前,析构函数可以非常有用地释放资源。

析构函数不能被继承或重载。

下面的例子演示了如何使用析构函数:

Class Line3
   Private length As Double    ' Length of a line'
   Public Sub New()   'parameterised constructor'
      Console.WriteLine("Object is being created")
   End Sub
   Protected Overrides Sub Finalize()  ' destructor'
      Console.WriteLine("Object is being deleted")
   End Sub
   Public Sub setLength(ByVal len As Double)
      length = len
   End Sub
   Public Function getLength() As Double
      Return length
   End Function
   Shared Sub Main()
      Dim line As Line3 = New Line3()
      'set line length '
      line.setLength(699.0)
      Console.WriteLine("Length of line : {0}", line.getLength())
      Console.ReadKey()
   End Sub
End Class

执行上面示例代码,得到以下结果 -

F:\worksp\vb.net\classes_objects>vbc Line3.vb
Microsoft (R) Visual Basic Compiler version 14.0.1038
for Visual Basic 2012
Copyright (c) Microsoft Corporation.  All rights reserved.

......

F:\worksp\vb.net\classes_objects>Line3.exe
Object is being created
Length of line : 699

VB.Net类的共享成员

可以使用Shared关键字将类成员定义为静态的。当将一个类的成员声明为Shared时,这意味着无论该类创建了多少个对象,该成员只有一个副本。

Shared关键字表示一个类只存在一个成员实例。共享变量用于定义常量,因为它们的值可以通过调用该类而不创建实例来调用获取。

共享变量可以在成员函数或类定义之外初始化。也可以在类定义中初始化共享变量。

可以声明一个成员函数为Shared。这样的函数只能访问共享变量。Shared函数甚至在创建对象之前就存在。

以下示例演示了共享(Shared)成员的使用:

Class StaticVar
   Public Shared num As Integer
   Public Sub count()
      num = num + 100
   End Sub
   Public Shared Function getNum() As Integer
      Return num
   End Function
   Shared Sub Main()
      Dim s As StaticVar = New StaticVar()
      s.count()
      s.count()
      s.count()
      Console.WriteLine("Value of variable num: {0}", StaticVar.getNum())
      Console.ReadKey()
   End Sub
End Class

执行上面示例代码,得到以下结果 -

F:\worksp\vb.net\classes_objects>vbc StaticVar.vb
Microsoft (R) Visual Basic Compiler version 14.0.1038
for Visual Basic 2012
Copyright (c) Microsoft Corporation.  All rights reserved.

.....

F:\worksp\vb.net\classes_objects>StaticVar.exe
Value of variable num: 300

继承

面向对象编程中最重要的概念之一就是继承。继承允许使用另一个类来定义一个类,这使得创建和维护应用程序变得更容易。这也提供了重用代码功能和快速实施时间的机会。

当创建一个类时,程序员可以指定新的类继承现有类的成员,而不是编写全新的数据成员和成员函数。这个现有的类被称为基类,新的类被称为派生类。

基础派生类

一个类可以从多个类或接口派生,这意味着它可以从多个基类或接口继承数据和函数。
VB.Net中用于创建派生类的语法如下所示:

<access-specifier> Class <base_class>
...
End Class
Class <derived_class>: Inherits <base_class>
...
End Class

考虑一个基类Shape及其派生类Rectangle

' 定义基类 '
Class Shape
   Protected width As Integer
   Protected height As Integer
   Public Sub setWidth(ByVal w As Integer)
      width = w
   End Sub
   Public Sub setHeight(ByVal h As Integer)
      height = h
   End Sub
End Class
' 子类或派生类 '
Class Rectangle : Inherits Shape
   Public Function getArea() As Integer
      Return (width * height)
   End Function
End Class
Class RectangleTester
   Shared Sub Main()
      Dim rect As Rectangle = New Rectangle()
      rect.setWidth(15)
      rect.setHeight(25)
      ' Print the area of the object. '
      Console.WriteLine("Total area: {0}", rect.getArea())
      Console.ReadKey()
   End Sub    
End Class

执行上面示例代码,得到以下结果 -

F:\worksp\vb.net\classes_objects>vbc BaseDerived.vb
Microsoft (R) Visual Basic Compiler version 14.0.1038
for Visual Basic 2012
Copyright (c) Microsoft Corporation.  All rights reserved.
.....
F:\worksp\vb.net\classes_objects>BaseDerived.exe
Total area: 375

基类初始化

派生类继承基类成员变量和成员方法。 因此,应该在创建子类之前创建超类对象。 在VB.Net中,超类或基类隐式地被称为:MyBase

以下程序演示了这一点:


' 定义基类 '
Class Shape
   Protected width As Integer
   Protected height As Integer
   Public Sub setWidth(ByVal w As Integer)
      width = w
   End Sub
   Public Sub setHeight(ByVal h As Integer)
      height = h
   End Sub
End Class
' 子类或派生类 '
Class Rectangle : Inherits Shape
   Public Function getArea() As Integer
      Return (width * height)
   End Function
End Class
Class RectangleTester
   Shared Sub Main()
      Dim rect As Rectangle = New Rectangle()
      rect.setWidth(15)
      rect.setHeight(25)
      ' Print the area of the object. '
      Console.WriteLine("Total area: {0}", rect.getArea())
      Console.ReadKey()
   End Sub    
End Class

执行上面示例代码,得到以下结果 -

F:\worksp\vb.net\classes_objects>vbc BaseClassInitialization.vb
Microsoft (R) Visual Basic Compiler version 14.0.1038
for Visual Basic 2012
Copyright (c) Microsoft Corporation.  All rights reserved.
......
F:\worksp\vb.net\classes_objects>BaseClassInitialization.exe
Length: 4.5
Width: 7.5
Area: 33.75
Cost: 2362.5