目录
一、多态的概念
多态的意思即为多种形态,现实生活中存在很多种多态的情况,例如,人们都有工作,但每个人的工作内容不一样。医生的工作是看病,清洁工的工作是打扫卫生等。如图
二、多态的使用
在面向对象思想中,多态的主要表现形式是:子类继承父类后对于同一个方法有不同的实现方式。多态的实现方式有两种:隐藏父类方法和重新父类方法。
1.new 关键字隐藏
在C#中,使用new关键字来达到隐藏父类成员的目的。代码如下
定义人类,包含工作方法:
class Person
{
public void Work()//定义工作方法
{
Console.WriteLine("人在工作");
}
}
定义医生类,清洁工类继承于人类:
class Doctor:Person
{
public new void Work()
{
Console.WriteLine("医生的工作是看病");
}
}
class Clearner:Person
{
public new void Work()
{
Console.WriteLine("清洁工的工作是扫地");
}
}
创建医生类,清洁工类对象,并调用方法:
static void Main(string[] args)
{
Person p = new Person();
Doctor d = new Doctor();
Clearner c = new Clearner();
p.Work();
d.Work();
c.Work();
}
运行结果位:
从图中可以看出父类对象调用的是父类的Work()方法,子类对象调用的是子类对象的方法。
当然,在子类中定义和父类同名的方法,不使用new关键字,子类中的方法也可隐藏父类中的同名方法,但编译器有可能报错。
2.方法重写
父类方法定义为虚方法(使用 Virtual 关键字)
class Person
{
public virtual void Work()//定义工作方法
{
Console.WriteLine("人在工作");
}
}
子类重新方法(使用 Override 关键字)
class Doctor:Person
{
public override void Work()
{
Console.WriteLine("医生的工作是看病");
}
}
创建子类,调用Work()方法:
static void Main(string[] args)
{
Doctor d = new Doctor();
d.Work();
}
输出为:
重写方法时,子类和父类方法的返回值类型、方法名和参数必须完全相同,子类方法的可访问性不能低于父类方法。
三、密封类
1.密封类简介
密封类使用sealed修饰,不能用作父类。因此,密封类主要用于房租派生子类。
语法:
sealed class 类名{
}
由于密封类不能被继承,使用类中的方法不能定义为虚方法。
2.密封方法
使用sealed修饰的方法称为密封方法,密封方法是指不允许子类再次重新的方法。
例如,定义骑士类继承于战士类、虽然战士类的Attack()方法没有使用 virtual修饰定义为虚方法,但他重写了Role 类的方法,使用在骑士类中可以再次被重写。代码如下
class Role
{
public virtual void Attack()//定义为虚方法
{
Console.WriteLine("角色使用了普通攻击");
}
}
class Warrior : Role//战士类继承Role
{
public override void Attack()
{
Console.WriteLine("战士使用了普通攻击");
}
}
class Knight : Warrior//骑士类继承战士类
{
public override void Attack()
{
Console.WriteLine("骑士使用了普通攻击");
}
}
如果不允许骑士类再次重新Attack()方法,可以在战士类中的Attack()方法前加上 sealed关键字,效果如下。
sealed修饰方法时只能于override一起使用,防止重写的方法再次被重写。