第六章 初始继承和多态

Posted mrgaoyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六章 初始继承和多态相关的知识,希望对你有一定的参考价值。

1.继承的概念

其实生活中有很多继承的例子。例如,在马路上跑的卡车,我们每天都乘坐的公共汽车,它们都是汽车。卡车有自己的特征:有货舱,有额定载重,行为都是可以拉货、卸货。而公共汽车的特征和行为:有客舱,有载客量,行为有报站、停靠站等。但是它们两个都有汽车的公共特征和行为:有轮胎,可以行驶,可以刹车。他们就是一种继承关系,卡车和公共汽车都继承汽车。

2.继承的好处

比如说现在有两个类,一个经理类PM,一个程序员的类SE,这两个类有同样的字段,姓名、性别、年龄、工号,既然它们有着同样的字段,我们都知道重复的定义相同的类成员会造成内存中的浪费,那我们就可以定义一个Employee类,作为它们两个的父类,让着程序员的类和经理的类继承于Employee类。(代码如下)

2.1这是父类的设计模式

//父类

public class Employee
    {
       //类的无参构造
       public Employee()
       {
           Console.WriteLine("我是父类无参构造");
       }
       //类的带参构造
       public Employee(string name, int age)
       {
           this.Name = name;
           this.Age = age;
       }

       //打招呼的方法
       public virtual void SayHi()
       {
           Console.WriteLine("大家好,我是{0},今年{1}岁,工号为{2},我的人气值{3}。", this.Name, this.Age, this.ID);
       }

        //类的成员
        protected string ID { get; set; }
        protected int Age { get; set; }
        protected string Name { get; set; }
        protected Gender Gender { get; set; }

2.2这是子类的设计模式

//子类
public class PM:Employee { //定义自己的构造,并隐式调用父类的无参构造 public PM(string id, string name, int age, Gender gender, int year) : base() //隐式调用父类的无参构造:base() { base.ID = id; base.Name = name; base.Age = age; base.Gender = gender; this.Year1 = year; } //自己的无参构造 public PM() { } //自己的私有成员 private int Year; protected int Year1 { get { return Year; } set { Year = value; } } //自己打招呼的方法 public override void SayHi() { Console.WriteLine("大家好,我是{0},今年{1}岁,项目管理经验{2}。", this.Name, this.Age, this.Year1); }

子类后面的PM:Employee就是PM继承于Employee了,继承的好处就是减少了代码的重复性,解决了代码的冗余问题。注:C#和java都是单继承语言它们不支持多继承

被继承的类被称为基类或超类,继承的类被称为派生类

 

3.base关键字和protected修饰符

base关键字与this关键字有所不同,base调用的方法都是父类的,this关键字是指本类的对象。protected修饰符,简单的说就是拿protected修饰符所修饰的成员他只能使本类和它的子类访问,其他类不能访问,就是说跟父类没有关系的类不能访问该成员。(在上面代码快中也有用到)

 

4.子类的构造的运行机制

当子类运行构造函数时,它会先去调用父类的构造函数。(子类构造运行图如下)

技术分享图片

 

 public PM(string id, string name, int age, Gender gender, int year)
           : base() //隐式调用父类的无参构造:base()
子类的构造函数会先调用父类的构造函数,语法就像上面的代码一样。

base关键字可以调用父类的非私有成员。

 

5.is a的应用

is关键字,这个关键字用来判断对象是否属于给定的类型。如果属于就返回true,不属于返回false。

if(empl is SE)表示判断对象是否为SE类型。

 

6.继承的价值

继承模拟了显示生活中的关系,OOP中强调一切皆对象,这符合我们面向对象编程的思考方向。

继承实现了代码的重用性,合理的使用继承,会使代码更加简洁。

继承是得程序结构清晰,子类和父类的层次结构清晰,最终的目的使子类只关注子类的相关行为和状态,无须关注父类的行为和状态。例如,学员(Student)只需要管理学号,爱好这种属性

,而公共的姓名,年龄、性别属性交给父类(Person)管理。

 

7.使用virtual关键字和override关键字实现多态

技术分享图片

这张截图上就是把父类定义好的一个打招呼的方法使用virtual关键字修饰代表虚方法的意思。

技术分享图片

这个就是子类重写父类的虚方法了,加上override关键字代表要重写父类的方法。(方法名需要一致)

上面的这个例子就是多态的表现了,如果有多个子类需要完成不同的事情就可以重写父类的虚方法完成多态的表现。

 

 






以上是关于第六章 初始继承和多态的主要内容,如果未能解决你的问题,请参考以下文章

第六章动手动脑

第六章 类型和成员基础

第六章

BPM-第六章-面向对象的PHP

[c++]第六章概念题 | 多态

第六章 Python类(面向对象编程)