您的位置:IT教程网首页>软件开发教程>VB教程>VB.NET面向对象的实现(3)继承

VB.NET面向对象的实现(3)继承

继续

本教程设计的内容有:基本的继续、阻止继续、继续与辖域、保护方法、重载方法、重载与构造方法、创建基类以及抽象方法。
当VB面向对象特性变得越来越强大的时候,我们会发觉VB缺少了继续的内容。继续是类为了得到父界面或者现有父类的一种能力。当创建一个新的从父界面或者现有父类继续而来的类的时候,我们就为原来的类创建了一个子类。这就是我们所知的父子关系。
现有许多关于继续的术语,但是很多是多余的。原来的类,即我们所继续的界面和行为可以由以下的几种互换的说法:
Parent class (父类)
Superclass (超级类)
Base class (基类)
而由原来的类继续而来的界面或者行为也有以下的几种互换的说法:
Child class (子类)
Subclass (次类)
继续是用于生物学上的名词。比如,狗是犬科动物而犬科动物又是哺乳动物,因此作为犬科动物,狗继续了哺乳动物所有的属性和行为,这就是继续的原始涵义,即生物学上的继续。在这里借用继续这个名词用于面向对象中,具有许多相似之处。
为了在VB中满足许多程序设计人员能够象在Visual C 中利用面向对象的功能,非凡是继续的功能,VB.net开始有了继续的概念。但是VB.net还是不答应多重继续,即子类不能有多个父类继续而来,它只能继续一个父类。而VB.NET答应深度的继续分级结构,即一个子类可以有另外一个子类继续而来;但是VB.NET还是不答应同时继续多个父类。
在父子关系中,父对象可以拥有多个子对象,而子对象虽然都是由父对象继续而来但是它们是不同类型的。举个例子,一群子女虽然都是由父母生育的,但是他们还是有不同的相貌、性格等等。
接下来我们具体介绍VB.NET的继续。

实现基本的继续

为了探讨继续,我们先考虑以下一个商业的例子:每一个定货都有一个线路项,可能有产品线路项和服务线路项。这两种线路项是有些不同的。但是当我们在分开实现ProductLine和ServiceLine类的时候,我们就会发现其实它们有许多相同之处。假如分开编写这两个类的代码,不仅编程效率低,而且程序代码也难以维护,所以最好的方法就是使用它们一些相同的代码。
为了实现使用相同的代码,继续就起了很大的作用了。使用继续,我们可以创建一个LineItem类(父类),它包含了所有的共用代码。然后我们再创建ProductLine和ServiceLine子类,这两个类是由LineItem继续而来的。这样它们就可以自动地获得所有的共用代码了。
假如LineItem类为:
Public Class LineItem

Private mintID As Integer
Private mstrItem As String
Private msngPrice As Single
Private mintQuantity As Integer

Public Property ID() As Integer
Get
Return mintID
End Get
Set
mintID = value
End Set
End Property

Public Property Item() As String
Get
Return mstrItem
End Get
Set
mstrItem = Value
End Set
End Property

Public Property Price() As Single
Get
Return msngPrice
End Get
Set
msngPrice = Value
End Set
End Property

Public Property Quantity() As Integer
Get
Return mintQuantity
End Get
Set
mintQuantity = Value
End Set
End Property

Public Function Amount() As Single
Return mintQuantity * msngPrice
End Function

End Class

这个类中有所有的共用代码以及一些基本的数据区域和用于计算项目价钱的方法。
假如线路项对于产品而言,我们则需要再增加一些代码。这个项目的数值应该要验证一下确保它指一个实际的产品,并且可能的话我们也想提供产品的描述,所以ProductLine类的代码如下:
Public Class ProductLine

Inherits LineItem

Private mstrDescription As String

Public ReadOnly Property Description() As String
Get
Return mstrDescription
End Get
End Property

Public Sub New(ByVal ProductID As String)
Item = ProductID
(此处你可以从数据库中转载产品数据)
End Sub

End Class

上面语句中我们已经使用的继续语句:
Inherits LineItem
这条语句使ProductLine类获得了LineItem类的所有的界面元素或者行为。所以我们可以如下编写客户代码:
Protected Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs)
Dim pl As ProductLine

pl = New ProductLine(23abc
MessageBox.Show(pl.Item)
MessageBox.Show(pl.Description)
End Sub

以上的代码使用了从LineItem类继续而来的Item属性以及ProductLine中的Description属性。
类似地,我们可以编写ServiceLine:
Public Class ServiceLine

Inherits LineItem

Private mdtDateProvided As Date

Public Sub New()
Quantity = 1
End Sub

Public Property DateProvided() As Date
Get
Return mdtDateProvided
End Get
Set
mdtDateProvided = Value
End Set
End Property

End Class

这里要注重的是,上面的继续语句表明ServiceLine是LineItem的子类。而DateProvided属性是从LineItem类中加入的界面。

阻止继续

在缺省状态下,我们创建的任何类都是作为一个基类使用的,而其它的类是有这个基类创建而来的。有时当我们想创建一个类,而这个子类不能被继续。为了做到这一点,我们可以在类的声明中使用NotInheritable要害字。
Public NotInheritable Class ProductLine

End Class

当使用了这个要害字,其它代码都不能使用Inherits要害字来创建一个由这个类继续而来的子类。

继续和辖域

当我们通过继续来创建一个子类的时候,新类就可以从父类中得到了所有的Public(公共)和Friend(友)方法、属性和变量。假如你在父类中声明一个Private(私有)的方法、属性和变量,那么在新的子类中就不能得到这个类的方法、属性和变量。
当然也有个例外,就是New方法。构造函数方法必须在每一个子类中重新编写。这个内容我们在本教程的后面将深入讨论。

共2页: 上一页 1 [2] 下一页