- 1
- 0
- 约1.05万字
- 约 40页
- 2022-11-02 发布于上海
- 举报
会计学
1
C程序设计及应用教程WHUT 面向对象的高级编程
5.1 类的继承与多态性
封装:隐藏调用者不需要了解的信息。
继承:简化类的设计,为系统维护提供便利。
多态:类为名称相同的方法提供不同实现方式的能力。
第1页/共40页
5.1.1 基类和扩充类
继承表示现实世界中遗传关系的直接模拟。
它表示类之间的内在联系以及对属性和操作的共享。
第2页/共40页
5.1.1 基类和扩充类
OOL中继承的两种实现方式:实现继承和接口继承。
被继承的类叫基类/父类
从基类继承来的类叫扩充类/派生类/子类
实现继承:表示一个类型派生于一个基类型,拥有该基类型的所有成员字段和函数。在实现继承中,派生类型的每个函数采用基类型的实现代码,除非在派生类型的定义中指定重写该函数的实现代码。例如:System. Windows.Forms.TextBox和System.Windows.Forms.ListBox派生于System.Windows.Forms.Control ,并重写了函数,或提供了新的函数,以实现特定类型的控件。
接口继承:表示一个类型只继承了函数的签名,没有继承任何实现代码。
C#中,实现继承只允许单一继承 ,接口可实现多重继承。因为System.Object是一个公共的基类,所以每个C#类(除了Object类之外)都有一个基类,还可以有任意多个基接口。
第3页/共40页
5.1.1 基类和扩充类
声明扩充类的语法:
[访问修饰符] class 扩充类名称:基类名称
{
//程序代码
}
扩充类继承了所有定义在基类中数据的定义和方法。但是扩充类不继承基类的构造函数。
注意:
C#不支持私有继承,因此基类名上没有public或private限定符
如果在类定义中没有指定基类,C#编译器就假定System.Object是基类。
第4页/共40页
5.1.1 基类和扩充类
【例5-1】基类和扩充类的定义及用法。
第5页/共40页
5.1.2 多态性
多态性是指对象可以表示多个类型的能力。
在C#中,多态性的定义是:同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。
3种实现多态性的方法:
通过继承实现多态性。
通过抽象类实现多态性。
通过接口实现多态性。
第6页/共40页
5.1.2 多态性
1、虚拟方法
在基类中,如果想让某个方法或者事件被扩充类重写,可以使用修饰符virtual表明:
public virtual void myMethod() //虚拟方法
{
……//程序代码
}
扩充类则用override重写:
public override void myMethod()
{
……//程序代码
}
第7页/共40页
5.1.2 多态(续)
使用虚拟方法和重写方法时,要注意下面几个方面:
虚拟方法不能声明为静态的。
virtual不能和private一起使用。
重写方法的名称、参数个数、类型以及返回值都必须和虚拟方法的一致。
第8页/共40页
5.1.2 多态(续)
【例5-2】重写基类的方法。
第9页/共40页
5.1.2 多态(续)
2、隐藏基类的方法
在扩充类中,可以使用new关键字来隐藏基类的方法,即使用一个完全不同的方法取代旧的方法。
与方法重写不同的是,使用new关键字时并不要求基类中的方法声明为virtual,只要在扩充类的方法前声明为new,就可以隐藏基类的方法。
class MyDerivedClass : HisBaseClass{ public new int MyGroovyMethod() { // some groovy implementation return 0; }}
【例5-3】
第10页/共40页
5.1.2 多态(续)
3.在扩充类直接调用基类的方法
使用base关键字
class CustomerAccount
{public virtual decimal CalculatePrice(){ // implementation return 0.0M;}} class GoldAccount : CustomerAccount{ public override decimal CalculatePrice() { return base.CalculatePrice() * 0.9M; }
}
第11页/共40页
5.1.3 抽象类
使用abstract修饰符。
抽象类只能做基类。
抽象类与非抽象类的区别:
第一是抽象类不能直接被实例化,只能在扩充类中通
原创力文档

文档评论(0)