项目八 任务二 多态(课件)-《算法与程序设计--C#》(河北科学技术出版社)同步精品课堂
|
28页
|
178人阅读
|
8人下载
精品
内容正文:
8.2 多态
算法与程序设计--C#
同步精品课堂
河北科学技术出版社
教学目标
一
理解每种多态实现方式的特点和适用场景
理解多态的特点
03
04
掌握使用new关键字、虚方法重写和方法重载实现多态
理解多态的概念
01
02
教学目标
掌握国家标准《机械制图》中有关图幅、比例、字体图线等基本规定。
教学重难点
二
教学难点
1、多态的概念和特点
2、使用 new 关键字、虚方法重写和方法重载实现多态的具体方式
教学重点
1、 new关键字与虚方法重写的区别
2、方法重载与多态的关系
教学难点
导入新课
三
讨论:
我们大家都知道不同的动物(如猫、狗)可以发出不同的叫声;一个手机充电接口可以适配多种充电器。这种现象在编程中称为多态。那么如何在编程中用一种方式来描述这种“同一行为,不同实现”的情况呢?
新知讲授
四
多态的概念
多态是面向对象编程的三大特性之一,它允许不同的对象对同一消息做出不同的响应。简单来说,就是同一个方法调用可以根据对象的实际类型执行不同的代码。多态可以提高代码的可维护性和可扩展性,使得代码更加灵活和通用。
➽多态的特点
(1)可替换性:多态的对象可以相互替换,而不影响程序的正常运行。
(2)可扩充性:可以方便地添加新的子类,而不需要修改现有的代码。
(3)接口性:多态通过抽象类或接口来定义统一的接口,子类实现这些接口。
(4)灵活性:可以根据实际情况动态地选择执行不同的代码。
新知讲授
四
多态的实现方式
(1)使用 new重新定义类的成员实现多态性
(2)虚方法的重写实现多态性
(3)使用方法重载;
➽使用 new重新定义类的成员实现多态性
使用 new 关键字可以隐藏基类的方法,在子类中定义一个与基类方法同名的方法。当通过基类引用调用该方法时,会调用基类的方法;当通过子类引用调用该方法时,会调用子类的方法。
新知讲授
四
· 示例:
class Animal //这是一个基类
{
public void Eat() //基类的方法
{ Console.WriteLine("动物要吃东西!"); }
}
class Dog : Animal //这是一个派生类
{ public new void Eat() //重新定义方法成员
{ Console.WriteLine("狗狗要吃骨头!");}
}
新知讲授
四
此时派生类Dog的方法Eat替换了基类Animal的方法Eat。若执行以下语句:
Dog d= new Dog();
d.Eat();
则调用的是新的类的成员方法,而不是基类的成员方法。因此最终得到以下结果:
狗狗要吃骨头!
新知讲授
四
➽虚方法的重写实现多态性
虚方法重写是指在基类中使用 virtual 关键字定义一个方法,在子类中使用 override 关键字重写该方法。
当通过基类引用调用该方法时,会根据对象的实际类型调用相应子类的方法。
· 作用
允许派生类重写基类中的方法,实现多态。
· 在基类中声明虚方法的格式
public virtual返回值类型 方法名称([参数列表])
{ //方法体语句 }
新知讲授
四
➽虚方法的重写实现多态性
· 在派生类中覆盖虚方法的格式如下:
public override 返回值类型 方法名称([参数列表])
{
//方法体语句
}
其中,基类与派生类中的方法名称与参数列表必须完全一致,当不需要参数时省略参数列表。override操作发生在程序运行之时。
新知讲授
四
· 示例:
class Animal
{
public virtual void Speak()
{ Console.WriteLine("Animal is speaking."); }
}
class Dog : Animal
{
public override void Speak()
{ Console.WriteLine("Dog is barking.");} }
新知讲授
四
· 示例:
class Program
{
static void Main(string[] args)
{
Animal animal = new Dog();
animal.Speak();
}
}
Dog is barking.
新知讲授
四
· 注意
类中的成员字段和静态方法不能声明为virtual,因为virtual只对类的实例函数和属性有意义。
· 使用virtual和override时要注意以下四点:
(1)字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的。
(2)使用virtual修饰符后,不允许再使用static、abstract或override修饰符;
(3)派生类对象即使被强制转换为基类对象,所引用的仍然是派生类的成员;
(4)派生类可以通过密封来停止虚拟继承,此时派生类的成员使用sealed override声明。
新知讲授
四
➽任务:分析下列程序的执行过程
// 基类
class Animal
{
public virtual void Speak()
{
Console.WriteLine("动物发出声音");
}
}
新知讲授
四
➽任务:分析下列程序的执行过程
// 子类
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("狗汪汪叫");
}
}
新知讲授
四
➽任务:分析下列程序的执行过程
static void Main()
{
Animal animal = new Animal();
animal.Speak(); // 调用基类的方法
Dog dog = new Dog();
dog.Speak(); // 调用子类的方法
Animal animalDog = new Dog();
animalDog.Speak(); // 调用子类的方法
}
动物发出声音
狗汪汪叫
狗汪汪叫
新知讲授
四
➽分析
1、Animal 类中使用 virtual 关键字将 Speak 方法定义为虚方法。
2、Dog 类中使用 override 关键字重写了 Speak 方法。
3、在 Main 方法中,通过基类引用 animalDog 指向 Dog 对象,调用 Speak 方法时会调用子类的方法。
新知讲授
四
➽方法重载实现多态性
通过方法重载,可以根据参数的类型选择相应的方法进行调用。这样,在同一个类中定义了多个具有相同名称但参数列表不同的方法,实现了多态性。根据实际参数的类型,调用相应的方法,从而实现不同的行为。这就是方法重载实现多态性的一种方式。
• 方法重载是指在同一个类中,允许定义多个同名方法,但参数列表必须不同。
• 方法重载通过方法签名(方法名和参数列表)来区分。
• 格式:
public void MethodName(int a) { ... }
public void MethodName(string b) { ... }
新知讲授
四
➽任务:分析下列程序的执行过程
class Calculator
{
public int Add(int a, int b)
{ return a + b; }
public double Add(double a, double b)
{ return a + b; }
}
新知讲授
四
➽任务:分析下列程序的执行过程
class Program
{
static void Main(string[] args)
{
Calculator calc = new Calculator();
Console.WriteLine(calc.Add(1, 2));
Console.WriteLine(calc.Add(1.5, 2.5)); } }
3
4.0
师生互动
五
1、总结多态的特点;
2、总结多态的实现方式;
讨论
随堂练习
六
1、方法重载是指在同一个类中,方法名 ______,参数列表 ______。
答案:相同 不同
解析:方法重载是指方法名相同,参数不同。
2、在C#中,使用______关键字可以在派生类中隐藏基类的方法。
答案:new
解析:new可以重新定义类的成员实现多态性。
随堂练习
六
3、以下关于 C# 多态的描述,正确的是( )
A. 多态只能通过虚方法实现
B. 多态允许不同类型的对象对同一消息作出不同的响应
C. 方法重载不属于多态的范畴
D. 使用 new 关键字隐藏基类方法不能实现任何形式的多态
答案:B
解析:多态的核心概念,不同类型的对象对于相同的操作(消息)可以有不同的实现方式。
随堂练习
六
4、 以下方式中可以实现多态的是( )
A. 使用new关键字
B. 使用virtual和override关键字
C. 使用方法重载
D. 以上都可以
答案:D
解析:new关键字可以隐藏基类方法,virtual和override可以实现虚方法的多态,方法重载也是一种多态形式。
随堂练习
六
5、若要在派生类中重写基类的虚方法,基类方法使用( )关键字声明,派生类方法使用( )关键字声明。
A. virtual;new
B. override;virtual
C. virtual;override
D. new;override
答案:C
解析:在 C# 中,基类的方法需要使用 virtual 关键字声明为虚方法,派生类中重写该虚方法时需要使用 override 关键字。
随堂练习
六
6.多态只能通过虚方法实现。( )
7.方法重载要求方法名相同,参数列表不同,返回值类型必须相同。( )
答案:6. 错 7. 错
解析:
6.多态可以通过虚方法、抽象方法、接口、方法重载等多种方式实现。
7.方法重载要求方法名相同,参数列表不同,但返回值类型可以不同。返回值类型不是方法重载的判断依据。
课堂小结
七
谢谢
$$