C#—继承和多态

  1. 为什么进行继承

  2. 什么是继承

  3. 继承怎么做

  • 继承的类型(实现继承只能由一个基类,接口继承可以有多个接口
  • 特殊情况下访问基类成员关键字base(1,在基类中的方法被派生类重写;2,实例化派生类对象的时候要调用基类构造函数)
  • 构造函数(自己在没有定义构造函数的时候,系统会默认给一个构造函数)
  • 类成员的继承(派生类继承基类除构造函数外的所有成员)
  • 类成员的访问(派生类能够访问基类中的所有非私有元素)
  • 隐藏方法(关键字:new)
  • 抽象类、抽象成员、虚方法、重写方法(抽象类关键字?ab,派生类必须实现所有抽象成员的实现;虚方法:virtual  只定义方法的签名;重写方法:override)
  • 接口(关键字:interfere,只定义方法的签名)
  • 隐藏方法、虚方法、重写方法(隐藏方法:在派生类中,new,有具体的实现过程;虚方法:在基类中,virtual,只有签名没有实现;重写方法:在派生类中,override,有具体的实现方法)
  • 抽象类和抽象成员(抽象类:abstract,包含抽象方法和具体方法;抽象成员:没有具体实现)
  • 接口(interface,没有具体实现)

一,为什么进行继承

为了增加现有类型的功能,或许多相关类型共用一组代码

二,什么是继承

继承允许重用现在类去创建新类。

子类获取基类的所有非私有数据和行为。

子类还可以定义其他数据或行为。

三,怎么实现继承

1,继承的类型

(1)实现继承

  • 表示一个类型派生于一个基类型
  • 派生类具有基类的所有非私有数据和行为
  • 派生类如果重写了基类中的方法,则该方法使用基类中定义的

(2)接口继承

  • 表示一个类型实现若干(多个)接口
  • 接口仅含方法的签名,不继承任何实现代码
  • 一般用于指定该类型具有某类可用的特性

???什么是方法的签名

方法的签名就是方法的定义,不包括方法的实现代码。

2,继承的规则

(1)声明派生类时,在类名称后放置一个冒号,冒号后接要从中继承的类(即基类)

                     C#—继承和多态

(2)派生类可以访问基类的非私有元素

(3)派生类的属性和方法不能直接访问基类的私有元素

(4)???派生类可以影响基类私有成员的状态,但只能通过基类继承的非私有属性方法来改变

(5)C#不支持多重继承,即一个派生类只能继承于一个基类

3,继承中的方法

(1)访问关键字base

在如下情况下使用base关键字从派生类中访问基类的成员:

  1. 创建派生类实例时应该调用基类的构造函数
  2. 调用基类中被派生类重写的方法
  3. base关键字只能用于实例构造函数、实例方法、实例访问器中使用

实例:

C#—继承和多态

2,构造函数的调用

  1. 如果类中没有构造函数,则编译器自动生成一个默认的构造函数
  2. 如果定义了构造函数,则编译器不会自动创建默认的构造函数
  3. 通过new创建对象实例时,会根据传入的参数用相匹配的构造函数
  4. 调用派生类的构造函数前要先调用基类的构造函数

3,类成员的继承

  1. 派生类继承基类中除了构造函数之外的所有成员
  2. 派生类继承其基类的所有成员,除了构造函数,与基类成员的访问修饰符无关

4,类成员的隐藏

如果派生类中声明了与继承的成员同名的成员,则该重名的成员将隐藏从基类继承的同名成员变量,称之为成员的隐藏。

5,隐藏方法、虚方法和重写方法

(1)隐藏方法   

在派生类中,采用关键词new中相同签名方法重新定义了基类中的方法,即隐藏了基类的同名方法

(2)虚方法

在基类中使用关键词virtual声明的方法,只有签名,没有实现的方法,为虚方法

(3)重写方法

在派生类中,使用关键词override声明的与基类中相同签名的方法,称之为重写方法

6,抽象类和抽象方法

抽象类没有实例化,可以包含抽象方法,可以包含具体的方法

抽象成员、抽象方法只有签名,没有具体实现。

(1)将关键字abstract置于关键字class的前面,则称该类为抽象类

(2)抽象类不能实例化

(3)抽象类一般用于提供多个派生类可共享的基类的公共定义

(4)抽象类包含抽象成员

(5)抽象类不能被密封

(6)当从抽象类派生非抽象类时,这些非抽象类必须实现所继承的所有抽象成员,从而重写那些抽象成员。

(7)将关键字abstract添加到实例方法的放回类型的前面可以定义抽象方法。

C#—继承和多态

7,接口

(1)接口本身不提供它所定义的成员的实现

(2)接口只指定实现该接口的类或结构必须提供的成员

(3)继承接口的任何非抽象类型都必须实现接口的所有成员

(4)接口类似于抽象类,不能实例化。

(5)接口中声明的所有成员隐式的为public和abstract。

(6)接口可以包含事件、索引器、方法、属性

(7)接口不能包含字段

实例:

C#—继承和多态