争怎路由网/网站教程/内容

Microsoft .NET 中的基类继承 (转自微软MSDN)(续)

网站教程2024-07-16 阅读

MyBase 关键字


可以从任一子类使用 MyBase 关键字,以调用基类中的任何属性或方法。即使基类的方法在子类中已被覆盖,您也可以使用该关键字对其进行调用。例如,如果在基类中存在 ReplaceAll 方法,但在子类中该方法已被覆盖,您可以从子类的 ReplaceAll 方法中调用基类的 ReplaceAll 方法。

试一试

  1. 打开 frmLineTest.vb 窗体。
  2. 双击 Replace(替换)以调出单击事件过程。
  3. btnReplace 按钮的单击事件中编写以下代码:
    Protected Sub btnReplace_Click( _ByVal sender As Object, _ ByVal e As System.EventArgs) Handles btnReplace.ClickDim oLine As LineDelim = New LineDelim()oLine.Delimiter = txtDelim.TextoLine.Line = txtLine.TexttxtReplace.Text = oLine.ReplaceAll()End Sub

    此代码将 Delimiter 属性设置为在示例窗体的 txtDelimiter 文本框中输入的值。然后您可以调用 ReplaceAll 方法,将文本行中的所有空格更改为新的分隔符字符。
  4. F5 键运行该项目。
  5. 单击 Replace(替换)。您将看到,在此按钮旁边的文本框中,句中的每个词之间都有一个逗号。

覆盖方法


添加 Delimiter 属性后,您可能想更改 LineDelim 类中的 GetWord 方法,以便使用相应的分隔符替代 Line 类使用的单个空格。因为您不一定想更改基类,所以需要覆盖 LineDelim 类中 GetWord 方法的功能。在 LineDelim 类中创建新的 GetWord 方法之前,您需要在 Line 类的 GetWord 方法声明中添加一个关键字。
  1. Solution Explorer(解决方案资源管理器)窗口中,打开 Line.vb 类的代码窗口。
  2. 找到 GetWord 方法的声明(声明不包含参数),如下所示:
    Public Overloads Function GetWord() As String
  3. 在函数声明中添加关键字 Overridable,如下所示(没有此关键字,就无法覆盖此方法)。
    Public Overridable Overloads Function GetWord() As String
  4. 打开 LineDelim.vb 类,并使用如下代码添加新的 GetWord 方法。
    Public Overloads Overrides Function GetWord() As StringDim astrWords() As StringastrWords = MyBase.Line.Split(mstrDelim.ToCharArray())Return astrWords(0)End Function

如果要更改基类中方法的功能,则有必要在函数声明中添加 Overrides 关键字。现在,LineDelim 类中的 GetWord 方法就可以使用 Delimiter 属性的值来分隔句中的词。
如果只覆盖其中一个 GetWord 方法,则代码只能查看这一个版本的方法,而无法调用其他版本的 GetWord 方法。要显示所有方法,您必须覆盖每一个方法,就象您在 LineDelim 类中所执行的操作一样。

试一试

  1. F5 键运行该项目。
  2. 在句中的每个词之间都输入一个逗号,并在 Delimiter(分隔符)文本框中输入一个逗号。
  3. 单击 Get Word(取词)。
    句中的第一个词将出现在该按钮旁边的文本框中。

抽象类


在本文上一部分的示例中,我们学习了如何创建 Person 对象,这是因为我们想处理普通的人。但是您可能会发现,如果不先添加一些特定的行为和/或数据,就无法使用 Person 类执行任何操作。因此您可以将 Person 类变为抽象类,抽象类仅定义将由子类创建的一般属性和方法。
将 Person 类定义为只能被继承的抽象类,而不是在运行时实际创建的对象。从该类继承的每个类(如 Employee 类)都将使用特定的功能来创建所有相应的属性和方法。例如,Employee 类将创建实际的 Print 方法,而 Person 类仅定义必须存在 Print 方法;Person 类中没有与 Print 方法相关联的代码。
使用抽象类的原因有多种。对于强制子类设计人员实现应用程序通常所需的所有接口,抽象类非常有用。您可以在不破坏客户端应用程序的情况下向子类添加新方法,这是使用接口所无法实现的;可以在基类中提供许多默认实现方法,从而减少子类需要完成的工作量。

接口继承


创建抽象类时,请使用关键字 Interface 而不是 Class。为接口命名,然后定义需要子类实现的所有属性和方法。这是因为基类中没有可以实现的属性和方法,它只包含一般数据,而不包含方法。您所创建的只是一个合约,它规定所有使用此接口的子类都必须遵循一定的规则。
  1. 现在,请在已创建的项目中添加一个新类。
  2. 从 Visual Studio 菜单中,单击 Project(项目),然后单击 Add Class(添加类)。
  3. 在类中添加以下代码:
    Interface PersonProperty FirstName() As StringProperty LastName() As StringSub Print()Sub Talk()End Interface

    您会发现,您定义属性和子过程的方法与您通常定义这些属性和过程的方法一样。唯一的差别在于,您没有为它们编写任何代码。现在来看看如何在类定义中使用此接口。
  4. 在上一步骤创建的类文件中添加以下代码:
    Public Class EmployeeImplements PersonPrivate mstrFirstName As StringPrivate mstrLastName As StringProperty FirstName() As String _ Implements Person.FirstNameGetReturn mstrFirstNameEnd GetSetmstrFirstName = ValueEnd SetEnd PropertyProperty LastName() As String _ Implements Person.LastNameGetReturn mstrLastNameEnd GetSetmstrLastName = ValueEnd SetEnd PropertySub Print() Implements Person.Print' 在此处添加一些代码End SubSub Talk() Implements Person.Talk' 在此处添加一些代码End SubEnd Class

在 Employee 类定义之后的第一行是 Implements Person。此关键字表示您要遵守 Person 接口中定义的合约。现在您可以定义该合约中的所有属性和方法。在每一个 Property 语句后面,都必须包含 Implements 关键字,并且必须指定接口的名称和您正在使用的方法/属性的名称(两个名称之间有一个点 [.])。Visual Basic .NET 将跟踪每一个接口,在所有接口创建完毕之前,您不能编译应用程序。
如果要运行代码,则需要创建相应的子过程,因为在上面的示例中这些子过程被保留为空。创建所有子过程后,您就可以与您通常创建并使用任何其他对象一样,声明并使用新的 Employee 对象了。

选择要使用的继承类型


有时候很难决定到底是使用实现继承还是使用接口继承,很多情况下,可能两种继承都会用到,但都只涉及一小部分。例如,您可能需要在 Line 类中添加必须被子类覆盖的方法定义,在过程定义中使用 MustOverride 关键字即可实现此操作。
Public MustOverride Sub Init()

将此定义添加到类中以后,其作用类似于一个接口。在子类中,必须定义 Init 方法,并且该方法必须使用 Overrides 关键字。以下是如何定义 Init 方法的示例:
Public Overrides Sub Init() mstrDelim = " " mstrLine = "测试行"End Sub

同样,请记住使用 Overrides 关键字。该关键字用于通知编译器此方法将覆盖父类中的 Init 方法。
注意: Microsoft .NET 框架的联机帮助中提供了设计指南,可以帮助您决定要使用的继承类型。

阻止继承


在某些情况下,您可能不希望其他类继承您的类。如果是这样,您可以使用关键字 NotInheritable 来阻止类的继承。
Public Class NotInheritable Employee ' 类定义End Class

Visual Basic 6.0 以来的新增功能


使用 Visual Basic .NET,您可以继承 .NET 框架包含的所有类。您可以创建自己的类,使这些类继承现有的类;并通过对代码进行简单更改来添加或删除功能。

总结


本文介绍了如何继承基类,如何向基类添加其他属性,以及如何使用 Overrides 关键字来替换基类中定义的功能。还介绍了使用 MyBase 关键字调用基类中的方法,从而扩展基类的功能。虽然继承并不是对所有的应用程序都适用,但如果使用正确,继承将成为一种非常强大的工具。

关于作者


Paul D. Sheriff(PSheriff@pdsa.com) 是 PDSA, Inc. 的所有者。该公司位于南加利福尼亚州,是一家自定义软件开发和咨询公司。Paul 是南加利福尼亚的 MSDN 区域总监,著有《Paul Sheriff Teaches Visual Basic》一书,他为 Keystone Learning Systems 制作了 70 多套关于 Visual Basic、SQL Server、.NET 和 Web 开发的视频教材,最近还将与 Ken Getz 合作出版一本关于 SAMS 的书,书名是《ASP.NET Jumpstart》。有关详细信息,请访问 PDSA, Inc. 的 Web 站点 www.pdsa.com。

关于 Informant Communications Group


Informant Communications Group, Inc. 是一家专注于信息技术行业的多媒体公司。它成立于 1990 年,专门从事软件开发出版物、会议、目录发布和 Web 站点等业务。ICG 在美国和英国均设有办事处,目前已成为享有盛誉的媒体和营销内容集成商,并以高质量的技术信息满足 IT 人员不断增长的需求。
© Informant Communications Group 和 Microsoft Corporation 版权所有。
技术编辑:PDSA, Inc.

……

相关阅读