C#编程指南——类的继承、多态性

1. 继承

<span style="font-size:14px;">public class A
{

}
public class B: A
{

}</span>

A:基类;B:派生类

派生类将获取基类的所有非私有数据和行为以及派生类为自己定义的所有其他数据和行为。因此,派生类具有两个有效类型:派生类的类型和它继承的类的类型。

在上面的示例中,类B既是有效的B,又是有效的A。访问B对象时,可以使用强制转换操作将其转换为A对象。强制转换不会更改B对象,但您的B对象视图将限制为A的数据和行为。将B强制转换为A后,可以将A重新强制转换为B。并非A所有示例都可强制转换为B,只有实际上是B的实例的那些实例才可以强制转换为B。如果将类B作为B类型访问,则可以同时获得类A和类B的数据和行为。

结构不能从其他结构或类中继承。类和结构都可以从一个或多个接口中继承。

2.多态性

对象可以表示多个类型的能力称为多态性。通过继承,一个类  可以用在多个类型:可以用在它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性。

C#中的每种类型都是多态的。类型可用作它们自己的类型或用作Object实例,因为任何类型都自动将Object 当做基类。

3.抽象类和类成员

声明:

在类声明中使用abstract 修饰符以指示某个类只能是其他类的基类。

public abstract class A:
{
    public abstract void Dowork(int i);
}

派生:

public class B:A
{
    public override void Dowork(int i)
    {
         // New implementation
     }
}

抽象类特性:

抽象类不能实例化

抽象类不能是密封的或静态的

抽象类中可以包含虚方法和非抽象方法

抽象类的派生类可以是抽象类或非抽象类

从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实现

抽象方法特性

抽象方法是隐式的虚方法

抽象方法只能存在于抽象类中

在抽象方法声明上使用static 或 virtual修饰符是错误的

抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号{}

当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。例如:

public class D
{
   public virtual void Dowork(int i)
   {
       // Original implementation
   }
}

public abstract class E :D
{
   public abstract override void Dowork(int);
}

public class F :E
{
   public override void Dowork(int i)
   {
      // New implementation
<span style="font-family: Arial, Helvetica, sans-serif;">    }</span>
}

如果将虚方法声明为抽象方法,则它对于从抽象类继承的所有类而言仍然是虚的。继承抽象方法的类无法访问该方法的原始实现。在前面的示例中,类 F 上的 DoWork 无法调用类 D 上的 DoWork。在此情况下,抽象类可以强制派生类为虚方法提供新的方法实现。

4.密封类

声明

在类声明中使用sealed修饰符以指示某个类为密封类

public sealed class D
{

}


特性:

密封类不能用在基类,因此,它也不能是抽象类。

结构是隐式密封的,因此不能被继承

密封成员

在对基类的虚成员进行重写的派生类上的类成员、方法、字段、属性或事件可以将该成员声明为密封成员。在用于以后的派生类时,这将取消成员的虚效果。方法是在类成员声明中将 sealed 关键字置于 override 关键字的前面。

当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。

5. 虚拟成员

virtual 关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。

虚拟成员可以有自己的实现。

虚拟成员可以有派生类重写。

默认情况下,方法是非虚拟的。不能重写虚拟方法。

virtual 修饰符不能与static, abstract, private 或 override 修饰符一起使用

6.重写

要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。

override 方法提供从基类继承的成员的新实现。由 override 声明重写的方法称为重写基方法。重写的基方法必须与 override 方法具有相同的签名

不能重写非虚方法或静态方法。重写的基方法必须是 virtualabstractoverride 的。

不能使用 newstaticvirtualabstract 修饰符来修改 override 方法。

不能使用 newstaticvirtualabstract 修饰符来修改 override 方法。

7.隐藏

new 关键字可以显式隐藏从基类继承的成员。隐藏继承的成员时,该成员的派生版本将替换基类版本。虽然可以在不使用 new 修饰符的情况下隐藏成员,但会生成警告。如果使用 new 显式隐藏成员,则会取消此警告,并记录要替换为派生版本这一事实。

通过继承隐藏名称采用下列形式之一:

  • 引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。

  • 引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。

  • 引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。

在 C# 中,派生类可以包含与基类方法同名的方法。

  • 基类方法必须定义为 virtual。

  • 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。

  • 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。

  • 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。

  • 可以从派生类中使用 base 关键字调用基类方法。

  • overridevirtual new 关键字还可以用于属性、索引器和事件中。














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本节提供有关关键的 C# 语言功能和 C# 可通过 .NET Framework 访问的功能的详细信息。 本节大部分内容都假定您已了解有关 C# 和一般编程概念的一些知识。如果您刚开始学习编程C#,则应从 Visual C# 指导教程开始。您可能还想访问 Visual C# 开发心,此处提供很多教程、示例和视频,可帮助您入门。 有关特定的关键字、运算符和预处理器指令的信息,请参见 C# 参考。有关 C# 语言规范的信息,请参见 C# 语言规范。 这部分提供有关 C# 关键字、运算符、编译器错误和警告的参考资料。 ---------------------------------------------------------------------------------- 语言部分 深入 C# 程序 Main() 和命令行参数(C# 编程指南型(C# 编程指南) 数组(C# 编程指南) 字符串(C# 编程指南) 语句、表达式和运算符(C# 编程指南和结构(C# 编程指南) 属性(C# 编程指南) 索引器(C# 编程指南) 委托(C# 编程指南) 事件(C# 编程指南) 泛型(C# 编程指南) LINQ 查询表达式(C# 编程指南) Lambda 表达式(C# 编程指南) 迭代器(C# 编程指南) 命名空间(C# 编程指南) 可空型(C# 编程指南) 不安全代码和指针(C# 编程指南) XML 文档注释(C# 编程指南) 平台部分 应用程序域(C# 编程指南) 程序集和全局程序集缓存(C# 编程指南) 属性(C# 编程指南) 集合C# 编程指南) 异常和异常处理(C# 编程指南) 互操作性(C# 编程指南) 线程处理(C# 编程指南) 性能(C# 编程指南) 反射(C# 编程指南C# DLL(C# 编程指南) 安全性(C# 编程指南) 请参见 其他资源 C# 参考 Visual C# Visual C# 指导教程 ---------------------------------------------------------------------------------- 本节内容 C# 关键字 提供指向有关 C# 关键字和语法的信息的链接。 C# 运算符 提供指向有关 C# 运算符和语法的信息的链接。 C# 预处理器指令 提供指向有关在 C# 源代码进行嵌入所使用的编译器命令的信息的链接。 C# 编译器选项 包括有关编译器选项以及如何使用这些选项的信息。 C# 编译器错误 包含一些代码段,演示 C# 编译器错误和警告的原因以更正方法C# 术语 提供 C# 单词和短语的词汇表。 相关章节 C# 语言规范 提供一些链接,供获取 Microsoft Word 格式的最新版本的 C# 语言规范。 C# 常见问题 在 C# Developer Center 提供内容不断增加的 C# 常见问题列表。 Microsoft 知识库C# 知识库文章 提供对存储在 MSDN 上的 C# 相关知识库文章的动态搜索。 Visual C# 提供 Visual C# 文档门户。 Visual C# 示例 提供 Visual C# 示例的列表和有关如何在本地磁盘上查找这些示例的说明。 Visual C# 代码编辑器功能 提供一些链接,这些链接指向描述 IDE 和编辑器的概念性主题及任务主题。 用 Visual C# 编写应用程序 提供一些链接,这些链接指向说明如何执行某些常见编程任务的主题。 C# 编程指南 包括关于如何使用 C# 编程语言的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值