第 09 讲:.NET 中的继承各种实战应用与多态原理分析

1. 继承基础

继承的概念:从现实生活中理解继承,说我们生活中的继承主要是财产,我们程序中的继承,主要是代码 (属性、方法) 通过创建一个 windows 窗体程序,观察两个窗体,我们可以发现它们都继承自 Form

A:代码复用

继承在使用中,有什么要求和特点呢?

特点:继承具有传递性! A–>B–>C A 会具有 B 和 C 的相关属性和方法,也就是 C 会把允许继承的内容,传递给他的下一级。

要求:继承虽然可以有很多层,但是继承具有单根性!也就是说一个类 A 可以继承自 B,但是 A 不能同时继承 C….

C++中是允许多重继承的,但是C#和java是不允许的。 A–>B,C 这个是不允许的,因为多重继承如果不注意的话很容易引起混乱。

我们刚才观察 Form 的继承关系,会看到如下内容:

public class Control : Component, IDropTarget, ISynchronizeInvoke, IWin32Window, IArrangedElement, IComponent, IDisposable, IBindableComponent

我们发现,Component 后面的全部是以 I 开头的类,其实这些全部是接口。也就是说,一个类可以同时继承一个父类,同时再实现多个接口。

2. 继承的基本使用

【1】 要求:当我们分析某些类的时候,如果这些类之间具有相同的属性和方法,我们可以考虑继承,但是使用继承的时候,要特别注意,我们就有继承关系的类之间,一定是 “同类”。人包括教师、学生、教务;动物虽然有部分属性和人是一样的,但他们不是同类,最好不要继承。

当创建学生类,讲师类的时候会发现 他们都有共同的属性和方法,比如姓名、身份证、出生日期和工作…. 为了实现继承和代码的复用,以上的内容应该放到父类 Person 中。

图片[1] - 第09讲:.NET中的继承各种实战应用与多态原理分析 - 登山亦有道

接着,我们创建两个子类:Student、Teacher 继承后,添加自己的特有属性和方法

特别注意:我们通过子类能使用的父类成员有 public 类型的,但是不能直接使用 private

【2】 使用:非常简单,和没有继承关系差不多的。

通过刚才的例子,大家只是体会到了代码复用。其他的好处,根本没有看到!只有通过后续的学习才能逐渐体会,下边先总结两点关于继承使用的经验:

  • 经验 1:在实际开发中,我们自己使用继承,不要把继承关系搞的太复杂,一般不要超过 3 层的继承。
  • 经验 2:如果你使用的继承过多,或继承的层数多,万一我们如果某些代码写的有问题,你改掉一个后,其他的子类全部受到影响。这种影响也被称为代码地震…

3. 继承与多态的实现

【1】 父类的定义

{
    //公共属性

    //公共方法

    //私有方法 (只能父类自己使用)

    //受保护的属性、方法 (只能子类内部使用)

    //父类还有一个重要的作用:(如果你不知道,我们从现实生活中思考:我们可以继承前人为完成的事业,或提出的某些理论)
   //言外之意,就是父类可以提出一个未完成的行为 (方法),然后让子类去实现!这个就是我们要说的抽象方法!

   //虚方法...
     
}

记住:抽象方法必须放到抽象类中。但是一个抽象类,是可以不包括任何抽象方法的!

【2】 子类的定义

子类继承的父类如果有抽象方法,则子类必须重写抽象方法,除非子类也是抽象类。

通过 VS 的智能代码提示可以很方便的实现抽象类中的抽象方法。

图片[2] - 第09讲:.NET中的继承各种实战应用与多态原理分析 - 登山亦有道
实现抽象类

【3】 虚方法的使用

在子类中,子类可以直接完全的使用虚方法的内容,也可以完全不使用虚方法的内容,当然还可以自己实现,同时继续使用虚方法的内容。

图片[3] - 第09讲:.NET中的继承各种实战应用与多态原理分析 - 登山亦有道
重写父类虚方法

通过调试得到结论:抽象方法是不可能被调用的,只有子类重写的方法被调用。父类虚方法是否被调用,取决于子类是否重写,和是否调用。

【4】 多态的相关概念

多态是面向对象编程语言的程序特性,特点是,当我们调用者使用多态机制的时候,可以不关心具体的实现。我们就想象成,我们想调用一种行为,但是这种行为可能有多种表现,而具体如何表现,我们程序编写时是无法知道的。只有程序运行的时候才能确定。这个行为是虚拟机本身特有的。多态就是一种灵活的扩展实现。

多态的本质是一种类型,是多种行为的实现。

多态告诉我们:面向抽象编程,可以让程序的扩展性大大增强!

特别注意:多态的行为,只能限于父类中的抽象方法或虚方法!

多态实现:父类定义抽象方法或者虚方法,不同子类分别重写抽象方法或虚方法即可。

© 版权声明
THE END
喜欢就支持一下吧
点赞65赞赏 分享
评论 晨岩, 涂鸦清单等人在此发表了 2 条热情洋溢的评论
匿名的头像 - 登山亦有道
提交
匿名的头像 - 登山亦有道

昵称

在 WordPress 上使用 Sticker Heo 增添互动时的乐趣吧 !

取消
昵称表情代码图片
    • 涂鸦清单的头像 - 登山亦有道
      涂鸦清单 Windows Chrome 86.0.4240.198
      • 晨岩的头像 - 登山亦有道
        晨岩作者 Windows Edge 104.0.1293.70