pPublic:Public类成员没有访问限制。在一个类成员前面添加Public关健字就使得它可以被随意访问。例如,Employee类中的PrintSalary方法就是一个public方法,可以从任何地方对它进行访问。 Private:秘密的类成员只能被该类内部的其他成员访问。使用Private关健字就可以使一个类成员成为秘密的。 Protected:被保护的类成员只能被该类的派生类和该类本身内部进行访问。使用Protected关健字就可以使类成员成为被保护的类成员。 Friend:具有friend级访问限制的类成员只能在定义该类的程序内部使用,使用Friend关健字就能使类成员具有friend级访问限制。 Protected friend:这是protected和friend二种访问类型的组合。这些不同的访问类型使面向对象编程具有了信息隐慝能力。也就是说,我们可以使用这些访问类型保护不愿意让别人访问的信息。 静态成员 我们再来看看表4、5、6中的Employee类,也许读者会对我们没有将System.Console类实例化就使用它的Write有点不理解,为什么我们可以这样做呢?因为在面向对象编程语言中,有一种被称作静态成员的特殊的类成员,VB.NET也有静态成员这一概念。 无需对一个对象实例化就可以使用其中的静态成员。例如,下面的表7中,SalaryLevel类中就只包含有静态的域: 类中的表态成员 Class SalaryLevel Public Shared Level1 As Decimal = 35000 Public Shared Level2 As Decimal = 40000 Public Shared Level3 As Decimal = 45000 Public Shared Level4 As Decimal = 50000 Public Shared Level5 As Decimal = 55000 Public Shared Level6 As Decimal = 60000 Public Shared Level7 As Decimal = 65000 Public Shared Level8 As Decimal = 70000 Public Shared Level9 As Decimal = 75000 Public Shared Level10 As Decimal = 80000 End Class
我们可以象表8中的程序所演示的那样在程序中使用类: Listing 8: Using a static member of a class
Imports System
Class SalaryLevel Public Shared Level1 As Decimal = 35000 Public Shared Level2 As Decimal = 40000 Public Shared Level3 As Decimal = 45000 Public Shared Level4 As Decimal = 50000 Public Shared Level5 As Decimal = 55000 Public Shared Level6 As Decimal = 60000 Public Shared Level7 As Decimal = 65000 Public Shared Level8 As Decimal = 70000 Public Shared Level9 As Decimal = 75000 Public Shared Level10 As Decimal = 80000 End Class
Class Employee
Dim yearlyBonus As Decimal = 4000
Public Sub PrintSalary() ' 使用SalaryLevel类的静态域向Console输出工资额 Console.Write(SalaryLevel.Level4) End Sub
Public Shared Sub Main() Dim employee As Employee employee = New Employee() employee.PrintSalary() End Sub
构造器 A 构造器是类初始化所必须使用的特殊方法,在VB.NET中,这一方法被称作New。但我们在前面的代码中可以发现,在类中我们没有定义New这个方法。正是这样,如果类中没有定义构造器,VB.NET将自动地创建一个构造器,当使用关健字New对对象进行初始化时,也就调用了类的构造器。当然,我们也可以自己编写对象在初始化时所运行的代码。 如果我们在程序中创建了构造器,VB.NET就不会再自动为该类创建构造器了。
从语法上说,在类名后加一个冒号,后面再加上关健字Inherits和父类的名字就可以完成对类的继承。例如,下面表9中的代码就通过扩充Employee类创建了一个被称为Manager的新类: 扩充类 Imports System
Class Employee
Dim salary As Decimal = 40000 Dim yearlyBonus As Decimal = 4000
Public Sub PrintSalary() ' print the salary to the Console Console.Write(salary) End Sub
End Class
Class Manager: Inherits Employee End Class
如果关健字出现在下一行上,则子类名后面的分号就不需要了,如下面的代码所示: Class Manager Inherits Employee End Class 现在,我们就可以初始化一个Manager对象,并使用Employee中的成员。如下面表10中的代码所示: 初始化Manager对象 Class Employee
Public salary As Decimal = 40000 Public yearlyBonus As Decimal = 4000
Public Sub PrintSalary() ' print the salary to the Console Console.Write(salary) End Sub
End Class
Class Manager: Inherits Employee End Class
Module Module1 Public Sub Main() Dim manager As Manager manager = New Manager() manager.PrintSalary() End Sub End Module
下面表11中的代码演示了如何通过编写一个新的PrintBonus方法来扩充Manager类别的方法: 在子类中添加新的方法 Class Manager: Inherits Employee Public Sub PrintBonus() Console.Write(yearlyBonus) End Sub End Class
注意成员可访问性限制的使用。例如,如果使yearlyBonus域具有private属性,该哉就不能被Manager类访问,因此,编译这样的代码就会发生错误。 继承是面向对象编程中常用的方法。实际上,.NETFramework类库中就有许多由继承其他类得到的类。例如,Windows.Forms名字空间中的Button类就是ButtonBase类的一个子类,而ButtonBase类本身又是Control类的一个子类。所有的类最终都是System.Object类的子类,在.NET Framework类库中,System.Object类被称为根或超级类。 表12中的代码演示了继承的强大功能: 扩充System.Windows.Forms.Form Public Class MyForm : Inherits System.Windows.Forms.Form End Class