-
为什么进行继承
-
什么是继承
-
继承怎么做
- 继承的类型(实现继承只能由一个基类,接口继承可以有多个接口)
- 特殊情况下访问基类成员关键字base(1,在基类中的方法被派生类重写;2,实例化派生类对象的时候要调用基类构造函数)
- 构造函数(自己在没有定义构造函数的时候,系统会默认给一个构造函数)
- 类成员的继承(派生类继承基类除构造函数外的所有成员)
- 类成员的访问(派生类能够访问基类中的所有非私有元素)
- 隐藏方法(关键字:new)
- 抽象类、抽象成员、虚方法、重写方法(抽象类关键字?ab,派生类必须实现所有抽象成员的实现;虚方法:virtual 只定义方法的签名;重写方法:override)
- 接口(关键字:interfere,只定义方法的签名)
- 隐藏方法、虚方法、重写方法(隐藏方法:在派生类中,new,有具体的实现过程;虚方法:在基类中,virtual,只有签名没有实现;重写方法:在派生类中,override,有具体的实现方法)
- 抽象类和抽象成员(抽象类:abstract,包含抽象方法和具体方法;抽象成员:没有具体实现)
- 接口(interface,没有具体实现)
一,为什么进行继承
为了增加现有类型的功能,或许多相关类型共用一组代码
二,什么是继承
继承允许重用现在类去创建新类。
子类获取基类的所有非私有数据和行为。
子类还可以定义其他数据或行为。
三,怎么实现继承
1,继承的类型
(1)实现继承
- 表示一个类型派生于一个基类型
- 派生类具有基类的所有非私有数据和行为
- 派生类如果重写了基类中的方法,则该方法使用基类中定义的
(2)接口继承
- 表示一个类型实现若干(多个)接口
- 接口仅含方法的签名,不继承任何实现代码
- 一般用于指定该类型具有某类可用的特性
???什么是方法的签名
方法的签名就是方法的定义,不包括方法的实现代码。
2,继承的规则
(1)声明派生类时,在类名称后放置一个冒号,冒号后接要从中继承的类(即基类)
(2)派生类可以访问基类的非私有元素
(3)派生类的属性和方法不能直接访问基类的私有元素
(4)???派生类可以影响基类私有成员的状态,但只能通过基类继承的非私有属性方法来改变
(5)C#不支持多重继承,即一个派生类只能继承于一个基类
3,继承中的方法
(1)访问关键字base
在如下情况下使用base关键字从派生类中访问基类的成员:
- 创建派生类实例时应该调用基类的构造函数
- 调用基类中被派生类重写的方法
- base关键字只能用于实例构造函数、实例方法、实例访问器中使用
实例:
2,构造函数的调用
- 如果类中没有构造函数,则编译器自动生成一个默认的构造函数
- 如果定义了构造函数,则编译器不会自动创建默认的构造函数
- 通过new创建对象实例时,会根据传入的参数用相匹配的构造函数
- 调用派生类的构造函数前要先调用基类的构造函数
3,类成员的继承
- 派生类继承基类中除了构造函数之外的所有成员
- 派生类继承其基类的所有成员,除了构造函数,与基类成员的访问修饰符无关
4,类成员的隐藏
如果派生类中声明了与继承的成员同名的成员,则该重名的成员将隐藏从基类继承的同名成员变量,称之为成员的隐藏。
5,隐藏方法、虚方法和重写方法
(1)隐藏方法
在派生类中,采用关键词new中相同签名方法重新定义了基类中的方法,即隐藏了基类的同名方法
(2)虚方法
在基类中,使用关键词virtual声明的方法,只有签名,没有实现的方法,为虚方法
(3)重写方法
在派生类中,使用关键词override声明的与基类中相同签名的方法,称之为重写方法
6,抽象类和抽象方法
抽象类没有实例化,可以包含抽象方法,可以包含具体的方法
抽象成员、抽象方法只有签名,没有具体实现。
(1)将关键字abstract置于关键字class的前面,则称该类为抽象类。
(2)抽象类不能实例化
(3)抽象类一般用于提供多个派生类可共享的基类的公共定义
(4)抽象类包含抽象成员
(5)抽象类不能被密封
(6)当从抽象类派生非抽象类时,这些非抽象类必须实现所继承的所有抽象成员,从而重写那些抽象成员。
(7)将关键字abstract添加到实例方法的放回类型的前面可以定义抽象方法。
7,接口
(1)接口本身不提供它所定义的成员的实现
(2)接口只指定实现该接口的类或结构必须提供的成员
(3)继承接口的任何非抽象类型都必须实现接口的所有成员
(4)接口类似于抽象类,不能实例化。
(5)接口中声明的所有成员隐式的为public和abstract。
(6)接口可以包含事件、索引器、方法、属性
(7)接口不能包含字段
实例: