C#学习第十一天 实现多态:虚方法、抽象类

一、面向对象基础之多态

面向对象里最高级的一个特征!

概念:让一个对象能够表现出多种状态(类型)

有多个类继承自同一个类,同名的方法中功能却不同,如果要写的话,要单独每一个写一下

Chinese cn1 = new Chinese("韩梅梅");
			Chinese cn2 = new Chinese("李雷");
			Japanese j1 = new Japanese("树下君");
			Japanese j2 = new Japanese("井边子");
			Korea k1 = new Korea("金秀贤");
			Korea k2 = new Korea("金贤秀");
			American a1 = new American("科比");
			American a2 = new American("奥尼尔");
			Person[] pers = {cn1,cn2,j1,j2,k1,k2,a1,a2};
			for(int i=0;i<pers.Length;i++)
			{
//				if(pers[i] is Chinese)
//					((Chinese)pers[i]).SayHello();
//				if(pers[i] is Japanese)
//					((Japanese)pers[i]).SayHello();
//				if(pers[i] is Korea)
//					((Korea)pers[i]).SayHello();
//				if(pers[i] is American)
//					((American)pers[i]).SayHello();
				
				//是否可以简化以上代码,使用一个对象表象出多种类型,用一个对象完成上述功能
				pers[i].SayHello();

实现多态的3种手段:

1、虚方法;  

1)第一步:将父类的方法标记为虚方法,使用关键字---virtual,说明这个方法可以被重写(这个函数也可以被调用,也可以实现功能)

public virtual void <span style="font-family: Arial, Helvetica, sans-serif;">SayHello</span>()

2)第二步:在子类的此同名方法使用关键字----override,重写这个方法

public override void <span style="font-family: Arial, Helvetica, sans-serif;">SayHello</span>()

pers[i].SayHello();

就会自动调用相应的子类的方法,多种输出


2、抽象类;

当父类中的方法不知道如何去实现的时候,可以考虑将父类写成“抽象类”,将父类的方法写成抽象方法,用关键字:abstract

public abstract class Animal
	{
		public abstract void Bark(); //抽象方法---没有方法体: 存在的意义就是让方法重写,来实现多态
	}
子类重写也是用关键字override
抽象类不能创建对象,只能创建子类的对象

Animal a = new Dog();
具体调用哪个方法取决于创建哪个子类的对象

要注意的地方:

1)抽象类的抽象成员,必须是抽象的,不能有任何实现,并且子类必须重写;

2)抽象类可以有非抽象成员,子类能继承并且不需要重写 

3)抽象类不能实例化(不能创建对象)

4)子类必须重写父类的所有抽象类,除非子类也是抽象类

5)子类重写抽象方法时,参数和返回值必须一一对应(一样)


如果父类中的方法有默认的实现,并且父类需要实例化(创建对象),这种多态用”虚方法“实现,父类定义成普通类

如果父类中的方法不需要默认的实现,并且不需要实例化(创建对象),这种多态就用”抽象类“来实现,把父类定义成抽象类










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值