Visual Basic 类和对象

类是一种用户定义类型,也称类类型。每个类包含数据说明和一组操作数据或传递消息的函数。

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


类定义

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

  1. [ <attributelist> ] [ accessmodifier ] [ Shadows ] [ MustInherit | NotInheritable ] [ Partial ] _
  2. Class name [ ( Of typelist ) ]
  3. [ Inherits classname ]
  4. [ Implements interfacenames ]
  5. [ statements ]
  6. End Class

其中,

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

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

  1. Module mybox
  2. Class Box
  3. Public length As Double ' Length of a box
  4. Public breadth As Double ' Breadth of a box
  5. Public height As Double ' Height of a box
  6. End Class
  7. Sub Main()
  8. Dim Box1 As Box = New Box() ' Declare Box1 of type Box
  9. Dim Box2 As Box = New Box() ' Declare Box2 of type Box
  10. Dim volume As Double = 0.0 ' Store the volume of a box here
  11. ' box 1 specification
  12. Box1.height = 5.0
  13. Box1.length = 6.0
  14. Box1.breadth = 7.0
  15. ' box 2 specification
  16. Box2.height = 10.0
  17. Box2.length = 12.0
  18. Box2.breadth = 13.0
  19. 'volume of box 1
  20. volume = Box1.height * Box1.length * Box1.breadth
  21. Console.WriteLine("Volume of Box1 : {0}", volume)
  22. 'volume of box 2
  23. volume = Box2.height * Box2.length * Box2.breadth
  24. Console.WriteLine("Volume of Box2 : {0}", volume)
  25. Console.ReadKey()
  26. End Sub
  27. End Module

结果如下:

  1. Volume of Box1 : 210
  2. Volume of Box2 : 1560

成员函数和封装

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

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

  1. Module mybox
  2. Class Box
  3. Public length As Double ' Length of a box
  4. Public breadth As Double ' Breadth of a box
  5. Public height As Double ' Height of a box
  6. Public Sub setLength(ByVal len As Double)
  7. length = len
  8. End Sub
  9. Public Sub setBreadth(ByVal bre As Double)
  10. breadth = bre
  11. End Sub
  12. Public Sub setHeight(ByVal hei As Double)
  13. height = hei
  14. End Sub
  15. Public Function getVolume() As Double
  16. Return length * breadth * height
  17. End Function
  18. End Class
  19. Sub Main()
  20. Dim Box1 As Box = New Box() ' Declare Box1 of type Box
  21. Dim Box2 As Box = New Box() ' Declare Box2 of type Box
  22. Dim volume As Double = 0.0 ' Store the volume of a box here
  23. ' box 1 specification
  24. Box1.setLength(6.0)
  25. Box1.setBreadth(7.0)
  26. Box1.setHeight(5.0)
  27. 'box 2 specification
  28. Box2.setLength(12.0)
  29. Box2.setBreadth(13.0)
  30. Box2.setHeight(10.0)
  31. ' volume of box 1
  32. volume = Box1.getVolume()
  33. Console.WriteLine("Volume of Box1 : {0}", volume)
  34. 'volume of box 2
  35. volume = Box2.getVolume()
  36. Console.WriteLine("Volume of Box2 : {0}", volume)
  37. Console.ReadKey()
  38. End Sub
  39. End Module

结果如下:

  1. Volume of Box1 : 210
  2. Volume of Box2 : 1560

构造函数和析构函数

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

下面的实例演示了构造函数的使用:

  1. Class Line
  2. Private length As Double ' Length of a line
  3. Public Sub New() 'constructor
  4. Console.WriteLine("Object is being created")
  5. End Sub
  6. Public Sub setLength(ByVal len As Double)
  7. length = len
  8. End Sub
  9. Public Function getLength() As Double
  10. Return length
  11. End Function
  12. Shared Sub Main()
  13. Dim line As Line = New Line()
  14. 'set line length
  15. line.setLength(6.0)
  16. Console.WriteLine("Length of line : {0}", line.getLength())
  17. Console.ReadKey()
  18. End Sub
  19. End Class

结果如下:

  1. Object is being created
  2. Length of line : 6

默认的构造函数没有任何参数,但是如果需要的话,构造函数可以有参数。这样的构造函数被称为 参数化构造函数

这种构造函数可以在创建对象时将初始值赋值,如以下面实例所示:

  1. Class Line
  2. Private length As Double ' Length of a line
  3. Public Sub New(ByVal len As Double) 'parameterised constructor
  4. Console.WriteLine("Object is being created, length = {0}", len)
  5. length = len
  6. End Sub
  7. Public Sub setLength(ByVal len As Double)
  8. length = len
  9. End Sub
  10. Public Function getLength() As Double
  11. Return length
  12. End Function
  13. Shared Sub Main()
  14. Dim line As Line = New Line(10.0)
  15. Console.WriteLine("Length of line set by constructor : {0}", line.getLength())
  16. 'set line length
  17. line.setLength(6.0)
  18. Console.WriteLine("Length of line set by setLength : {0}", line.getLength())
  19. Console.ReadKey()
  20. End Sub
  21. End Class

结果如下:

  1. Object is being created, length = 199
  2. Length of line set by constructor : 199
  3. Length of line set by setLength : 68

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

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

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

下面的是一个析构函数的实例:

  1. Class Line
  2. Private length As Double ' Length of a line
  3. Public Sub New() 'parameterised constructor
  4. Console.WriteLine("Object is being created")
  5. End Sub
  6. Protected Overrides Sub Finalize() ' destructor
  7. Console.WriteLine("Object is being deleted")
  8. End Sub
  9. Public Sub setLength(ByVal len As Double)
  10. length = len
  11. End Sub
  12. Public Function getLength() As Double
  13. Return length
  14. End Function
  15. Shared Sub Main()
  16. Dim line As Line = New Line()
  17. 'set line length
  18. line.setLength(6.0)
  19. Console.WriteLine("Length of line : {0}", line.getLength())
  20. Console.ReadKey()
  21. End Sub
  22. End Class

结果如下:

  1. Object is being created
  2. Length of line : 699

VB 类的共享成员

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

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

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

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

下面是一个使用 Shared 成员的实例

  1. Class StaticVar
  2. Public Shared num As Integer
  3. Public Sub count()
  4. num = num + 1
  5. End Sub
  6. Public Shared Function getNum() As Integer
  7. Return num
  8. End Function
  9. Shared Sub Main()
  10. Dim s As StaticVar = New StaticVar()
  11. s.count()
  12. s.count()
  13. s.count()
  14. Console.WriteLine("Value of variable num: {0}", StaticVar.getNum())
  15. Console.ReadKey()
  16. End Sub
  17. End Class

结果如下:

  1. Value of variable num: 300

继承

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

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


基类与派生类

一个类可以从多个类或接口派生,这意味着它可以从多个基类或接口继承数据和函数。

VB 中用于创建派生类的语法如下所示:

  1. <access-specifier> Class <base_class>
  2. ...
  3. End Class
  4. Class <derived_class>: Inherits <base_class>
  5. ...
  6. End Class

比如一个基类 Shape 及其派生类 Rectangle:

  1. ' Base class
  2. Class Shape
  3. Protected width As Integer
  4. Protected height As Integer
  5. Public Sub setWidth(ByVal w As Integer)
  6. width = w
  7. End Sub
  8. Public Sub setHeight(ByVal h As Integer)
  9. height = h
  10. End Sub
  11. End Class
  12. ' Derived class
  13. Class Rectangle : Inherits Shape
  14. Public Function getArea() As Integer
  15. Return (width * height)
  16. End Function
  17. End Class
  18. Class RectangleTester
  19. Shared Sub Main()
  20. Dim rect As Rectangle = New Rectangle()
  21. rect.setWidth(5)
  22. rect.setHeight(7)
  23. ' Print the area of the object.
  24. Console.WriteLine("Total area: {0}", rect.getArea())
  25. Console.ReadKey()
  26. End Sub
  27. End Class

结果如下:

  1. Total area: 375

基类初始化

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

比如下面的实例:

  1. ' Base class
  2. Class Rectangle
  3. Protected width As Double
  4. Protected length As Double
  5. Public Sub New(ByVal l As Double, ByVal w As Double)
  6. length = l
  7. width = w
  8. End Sub
  9. Public Function GetArea() As Double
  10. Return (width * length)
  11. End Function
  12. Public Overridable Sub Display()
  13. Console.WriteLine("Length: {0}", length)
  14. Console.WriteLine("Width: {0}", width)
  15. Console.WriteLine("Area: {0}", GetArea())
  16. End Sub
  17. 'end class Rectangle
  18. End Class
  19. 'Derived class
  20. Class Tabletop : Inherits Rectangle
  21. Private cost As Double
  22. Public Sub New(ByVal l As Double, ByVal w As Double)
  23. MyBase.New(l, w)
  24. End Sub
  25. Public Function GetCost() As Double
  26. Dim cost As Double
  27. cost = GetArea() * 70
  28. Return cost
  29. End Function
  30. Public Overrides Sub Display()
  31. MyBase.Display()
  32. Console.WriteLine("Cost: {0}", GetCost())
  33. End Sub
  34. 'end class Tabletop
  35. End Class
  36. Class RectangleTester
  37. Shared Sub Main()
  38. Dim t As Tabletop = New Tabletop(4.5, 7.5)
  39. t.Display()
  40. Console.ReadKey()
  41. End Sub
  42. End Class
注意:VB 支持多继承