当前位置:编程学习 > C#/ASP.NET >>

Microsoft .NET 中的基类继承

答案:     摘要:本文介绍了继承,说明了如何继承基类,并且介绍了 Microsoft .NET 中的实现继承和接口继承。
  
  目标
  继承概述
  了解如何继承基类
  了解接口继承
  了解实现继承
  前提条件
  要彻底理解本文内容,需要满足以下条件:
  
  了解基本编码
  了解类及其工作原理,或者阅读过 Creating Classes in .NET(英文)一文
  可以使用 Microsoft® Visual Basic® .NET
  目录
  继承概述
  继承基类
  构建示例窗体
  创建子类
  添加其他功能
  MyBase 关键字
  抽象类
  选择要使用的继承类型
  Visual Basic 6.0 以来的新增功能
  总结
  继承概述
  面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。在 Microsoft® Visual Basic® .NET 发布之前,Visual Basic 程序员并不具备这种能力。在 Visual Basic .NET 中,您可以继承 Microsoft .NET 框架中的类,也可以继承您自己创建的类。在本文中,我们将学习如何使用继承,并了解继承是如何大大缩短编程时间的。
  
  简单示例
  在您创建的许多类中,您会发现您常常需要与先前创建的类中的属性和方法相同的属性和方法。例如,如果有一个名为 Person 类的基类,该类包含 LastName 和 FirstName 属性以及 Print 方法,您会发现对于 Employee 类您也需要这些属性和方法。您可能还需要其他属性,例如 EmployeeID 和 Salary。如果从 Person 类(基类)继承,您可以将这些属性添加到新的 Employee 类中,并且仍然可以访问 Person 类中的所有属性。继承是指某个类可将其自身定义为具有某个特定类的所有属性和方法,然后再通过添加其他属性和方法对基类的定义进行扩展的能力。
  
  继承术语
  在深入研究这个主题之前,让我们先来定义几个术语。通过继承创建的新类称为“子类”,被继承的类称为“基类”、“父类”或“超类”。在某些 OOP 语言中,一个子类可以继承多个基类。也就是说,如果有一个 Person 类和一个 Car 类,则 Driver 类可以继承这两个类的所有属性和方法。而在 .NET 中,只允许单一继承,因此每个子类只能有一个基类。
  
  .NET 支持三类继承:实现继承、接口继承和可视继承。实现继承是指使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。
  
  在 .NET 中,一个类可以从某个基类继承而来,而这个基类又可以从另外一个类继承而来。而且,您可以在一个类中使用一个或多个接口。
  
  使用继承的原因
  继承可以避免重复编写相同的代码,因此十分有用。如果有两个单独的类,而每个类都必须实现 FirstName 和 LastName 属性,则可能会出现重复代码。如果要更改某个属性的实现方式,则需要查找已实现这些属性的所有类以进行更改。这不仅要耗费大量时间,还增加了不同类中出现错误的风险。
  
  在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。
  
  覆盖
  从基类中继承功能时,您可能会发现在基类中编写的一般方法仅执行继承类所需的部分功能。要执行所需的全部功能,您可以在新类中覆盖基类的方法,而无需使用新的名称创建一个全新的方法。
  
  进行覆盖时,您可以选择完全覆盖基类的方法,也可以在继承类中编写代码来执行某些操作,然后再调用基类的方法。在覆盖时,请务必仍然使用与原始方法相同的合约(参数和返回类型)。也可以选择先调用基类的方法,然后在执行完基类的方法后编写其他代码。
  
  继承基类
  继承使您可以在一个类中使用另一个类的全部属性和方法。您可以使用关键字 Inherits 来获得基类的功能,而无需将代码从一个类复制并粘贴到另一个类中。
  
  实现继承
  本文将创建一个新类 LineDelim,它将继承 Creating Classes in .NET(英文)一文中创建的 Line 类的所有功能。之后,本文将通过添加两个其他属性和一个方法对 Line 类进行扩展。要添加的第一个属性是 Delimiter,使用它可以获得一个分隔符字符,并将其设置到类中。此分隔符将用于将行中的所有空格替换为分隔符字符。要添加的第二个属性是 OriginalLine,它将用于在向文本行插入新的分隔符之前保留文本的原始行。要创建的新方法是 ReplaceAll(),它将用于将文本行中的所有空格替换为分隔符字符。然后我们将学习如何覆盖 GetWord 方法,以便使用此分隔符(而不是空格)分隔文本行并搜索第一个词。
  
  构建示例窗体
  图 1 中显示的示例窗体将用来测试要创建的继承类。
  
  
  
  图 1:用于测试继承的示例窗体
  
  要创建图 1 所示的窗体,请单击 Project(项目),然后单击 Add Windows Form(添加 Windows 窗体)。
  将窗体命名为 frmLineTest.vb 并单击 OK(确定)。
  然后在该窗体上创建相应的控件并设置属性,如表 1 所示。
  表 1:用于测试继承的窗体 控件 属性 值
  Label Name Label1
   Text Line of Text
  TextBox Name txtLine
   Text The rain in Spain stays mainly in the plain
  TextBox Name txtDelim
   Text ,
  GroupBox Name fraWord
   Text Get First Word
  CommandButton Name btnFirst
   Text Get Word
  TextBox Name txtFirstWord
   Text
   ReadOnly True
  CommandButton Name btnReplace
   Text Replace
  TextBox Name txtReplace
   Text
   ReadOnly True
  
  
  构建 Line 类
  
  接下来将构建要继承的 Line 类。
  
  从菜单中单击 Project(项目),然后单击 Add Class(添加类)。
  键入如下所示的代码。
  Public Class Line
   Private mstrLine As String
  
   Property Line() As String
   Get
   Return mstrLine
   End Get
   Set(ByVal Value As String)
   mstrLine = Value
   End Set
   End Property
  
   ReadOnly Property Length() As Integer
   Get
   Return mstrLine.Length
   End Get
   End Property
  
   Public Function GetWord() As String
   Dim astrWords() As String
  
   astrWords = mstrLine.Split(" ".ToCharArray())
  
   Return astrWords(0)
   End Function
  End Class
  
  创建子类
  既然窗体和基类都已经创建完毕,现在便可以开始执行继承了。
  
  单击 Project(项目),然后单击 Add Class(添加类)。将该类命名为 LineDelim.vb 并单击 OK(确定)。
  添加新类时,请修改 Visual Basic .NET 所创建的代码,使之与下面的示例代码相似。
  Public Class LineDelim
   Inherits Line
  
  End Class
  因为添加了 Inherits Line 语句,所以您可以在这一新创建的类中使用 Line 类的所有属性和方法。
  
  试一试
  打开 frmLineTest.vb 窗体。
  双击 Get Word(取词)按钮。
  向此按钮的单击事件过程添加以下代码:
  Protected Sub btnFirst_Click(ByVal sender As Object, _
   ByVal e As System.EventArgs) Handles btnFirst.Click
   Dim oLine As LineDelim = New LineDelim()
  
   oLine.Line = txtLine.Text
   txtFirstWord.Text = oLine.GetWord()

上一个:用C#电子邮件验证的类
下一个:C#锐利体验(5.3)

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,