在您创建的许多类中,您会发现您常常需要与先前创建的类中的属性和方法相同的属性和方法。例如,如果有一个名为 Person 类的基类,该类包含 LastName 和 FirstName 属性以及 Print 方法,您会发现对于 Employee 类您也需要这些属性和方法。您可能还需要其他属性,例如 EmployeeID 和 Salary。如果从 Person 类(基类)继承,您可以将这些属性添加到新的 Employee 类中,并且仍然可以访问 Person 类中的所有属性。继承是指某个类可将其自身定义为具有某个特定类的所有属性和方法,然后再通过添加其他属性和方法对基类的定义进行扩展的能力。
继承术语
在深入研究这个主题之前,让我们先来定义几个术语。通过继承创建的新类称为“子类”,被继承的类称为“基类”、“父类”或“超类”。在某些 OOP 语言中,一个子类可以继承多个基类。也就是说,如果有一个 Person 类和一个 Car 类,则 Driver 类可以继承这两个类的所有属性和方法。而在 .NET 中,只允许单一继承,因此每个子类只能有一个基类。
.NET 支持三类继承:实现继承、接口继承和可视继承。实现继承是指使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力。
在 .NET 中,一个类可以从某个基类继承而来,而这个基类又可以从另外一个类继承而来。而且,您可以在一个类中使用一个或多个接口。
使用继承的原因
继承可以避免重复编写相同的代码,因此十分有用。如果有两个单独的类,而每个类都必须实现 FirstName 和 LastName 属性,则可能会出现重复代码。如果要更改某个属性的实现方式,则需要查找已实现这些属性的所有类以进行更改。这不仅要耗费大量时间,还增加了不同类中出现错误的风险。
在考虑使用继承时,有一点需要注意,那就是两个类之间的关系应该是“属于”关系。例如,Employee 是一个人,Manager 也是一个人,因此这两个类都可以继承 Person 类。但是 Leg 类却不能继承 Person 类,因为腿并不是一个人。
本文将创建一个新类 LineDelim,它将继承 Creating Classes in .NET(英文)一文中创建的 Line 类的所有功能。之后,本文将通过添加两个其他属性和一个方法对 Line 类进行扩展。要添加的第一个属性是 Delimiter,使用它可以获得一个分隔符字符,并将其设置到类中。此分隔符将用于将行中的所有空格替换为分隔符字符。要添加的第二个属性是 OriginalLine,它将用于在向文本行插入新的分隔符之前保留文本的原始行。要创建的新方法是 ReplaceAll(),它将用于将文本行中的所有空格替换为分隔符字符。然后我们将学习如何覆盖 Getword 方法,以便使用此分隔符(而不是空格)分隔文本行并搜索第一个词。