定义类时,可以为数据类型定义蓝图.这实际上并没有定义任何数据,但它确实定义了类名的含义,即类的对象将包含什么以及可以对这样的对象执行什么操作.
对象是类的实例.构成类的方法和变量称为类的成员.
类定义以关键字类开头后跟班级名称;和类主体,以End Class语句结束.以下是类定义的一般形式 :
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ MustInherit | NotInheritable ] [ Partial ] _ Class name [ ( Of typelist ) ] [ Inherits classname ] [ Implements interfacenames ] [ statements ] End Class
其中,
属性列表 是适用于该类的属性列表.可选.
accessmodifier 定义类的访问级别,其值为 - Public,受保护,朋友,受保护的朋友和私人.可选.
阴影 表示该变量重新声明并隐藏了一个名称相同的元素,或者基类中重载元素的集合.可选.
MustInherit 指定该类只能用作基类,而您不能直接从它创建一个对象,即一个抽象类.可选.
NotInheritable 指定该类不能用作基类.
部分 表示该类的部分定义.
继承 指定它继承的基类.
Implements 指定类继承的接口.
以下示例演示了Box类,有三个数据成员,长度,宽度和高度:
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
编译并执行上述代码时,会产生以下结果 :
Volume of Box1 : 210 Volume of Box2 : 1560
类的成员函数是一个函数,它在类定义中的定义或原型与任何其他变量一样.它对该类所属的任何对象进行操作,并且可以访问该对象的类的所有成员.
成员变量是对象的属性(从设计角度来看)并且它们被保密以实现封装.这些变量只能使用公共成员函数访问.
让我们在上面设置概念并获取类中不同类成员的值 :
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 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
编译执行上述代码时,产生t他跟随结果:
Volume of Box1 : 210 Volume of Box2 : 1560
类构造函数是类的一个特殊成员Sub,只要我们创建新的对象就会执行它类.构造函数的名称为 New ,它没有任何返回类型.
以下程序解释了构造函数的概念 :
Class Line Private length As Double ' Length of a line Public Sub New() 'constructor Console.WriteLine("Object is being created") 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 Line = New Line() 'set line length line.setLength(6.0) Console.WriteLine("Length of line : {0}", line.getLength()) Console.ReadKey() End Sub End Class
当编译并执行上面的代码时,它产生以下结果 :
Object is being created Length of line : 6
默认构造函数没有任何参数,但如果需要,构造函数可以有参数.这种构造函数称为参数化构造函数.此技术可帮助您在创建对象时为其分配初始值,如以下示例所示 :
Class Line 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 Line = New Line(10.0) Console.WriteLine("Length of line set by constructor : {0}", line.getLength()) 'set line length line.setLength(6.0) Console.WriteLine("Length of line set by setLength : {0}", line.getLength()) Console.ReadKey() End Sub End Class
编译并执行上述代码时,会产生以下结果 :
Object is being created, length = 10 Length of line set by constructor : 10 Length of line set by setLength : 6
析构函数是类的特殊成员Sub,只要其类的对象超出范围,就会执行.
A 析构函数的名称为 Finalize ,它既不能返回值也不能接受任何参数.析构函数对于在退出程序之前释放资源非常有用,例如关闭文件,释放内存等.
析构函数不能被继承或重载.
下面的例子解释了析构函数的概念 :
Class Line 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 Line = New Line() 'set line length line.setLength(6.0) Console.WriteLine("Length of line : {0}", line.getLength()) Console.ReadKey() End Sub End Class
当编译并执行上面的代码时,它产生以下结果 :
Object is being created Length of line : 6 Object is being deleted
我们可以使用Shared关键字将类成员定义为static.当我们将一个类的成员声明为Shared时,这意味着无论创建了多少个类的对象,该成员只有一个副本.
关键字共享意味着一个类只存在一个成员实例.共享变量用于定义常量,因为可以通过调用类来检索它们的值,而无需创建它的实例.
可以在成员函数或类定义之外初始化共享变量.您还可以在类定义中初始化共享变量.
您还可以将成员函数声明为Shared.此类函数只能访问共享变量.甚至在创建对象之前就存在共享函数.
以下示例演示共享成员的使用 :
Class StaticVar Public Shared num As Integer Public Sub count() num = num + 1 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
编译并执行上述代码时,它会产生以下代码结果 :
Value of variable num: 3
面向对象编程中最重要的概念之一是继承.继承允许我们根据另一个类定义一个类,这样可以更容易地创建和维护一个应用程序.这也提供了重用代码功能和快速实现时间的机会.
创建类时,程序员可以指定新类,而不是编写全新的数据成员和成员函数.应该继承现有类的成员.此现有类称为 base 类,新类称为派生类.
一个类可以从多个类或接口派生,这意味着它可以从多个基类或接口继承数据和函数.
VB.Net中用于创建派生类的语法如下 :
<access-specifier> Class <base_class> ... End Class Class <derived_class>: Inherits <base_class> ... End Class
考虑一个基类Shape及其派生类Rectangle :
' Base class 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 ' Derived 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(5) rect.setHeight(7) ' Print the area of the object. Console.WriteLine("Total area: {0}", rect.getArea()) Console.ReadKey() End Sub End Class
编译并执行上述代码时,会产生以下结果 :
Total area: 35
派生类继承基类成员变量和成员方法.因此,应在创建子类之前创建超类对象.超类或基类在VB.Net中隐含地称为 MyBase
以下程序演示了这个 :
' Base class Class Rectangle Protected width As Double Protected length As Double Public Sub New(ByVal l As Double, ByVal w As Double) length = l width = w End Sub Public Function GetArea() As Double Return (width * length) End Function Public Overridable Sub Display() Console.WriteLine("Length: {0}", length) Console.WriteLine("Width: {0}", width) Console.WriteLine("Area: {0}", GetArea()) End Sub 'end class Rectangle End Class 'Derived class Class Tabletop : Inherits Rectangle Private cost As Double Public Sub New(ByVal l As Double, ByVal w As Double) MyBase.New(l, w) End Sub Public Function GetCost() As Double Dim cost As Double cost = GetArea() * 70 Return cost End Function Public Overrides Sub Display() MyBase.Display() Console.WriteLine("Cost: {0}", GetCost()) End Sub 'end class Tabletop End Class Class RectangleTester Shared Sub Main() Dim t As Tabletop = New Tabletop(4.5, 7.5) t.Display() Console.ReadKey() End Sub End Class
当编译并执行上述代码时,它会产生以下结果 :
Length: 4.5 Width: 7.5 Area: 33.75 Cost: 2362.5
VB .Net支持多重继承.