C#多态总结
↵
C#多态
多态 就是同一个方法在不同情况下,会选择不同的效果(多种形态)。
注:同一个父类对象赋予不同的子类对象 就会发生不同的效果。
一、里氏转换
1.子类可以赋值给父类
2.如果父类中装的是子类的对象,则可以将这个父类转换为对应的子类对象
作用:我们可以将所有的子类都当作是父类来看,针对父类进行编程,写出通用的代码,适用需求的不断改变
父类 a=new 子类();
注意:当1个父类变量指向了一个子类对象只能通过这个父类变量调用父类的成员子类独有的成员无法调用
- 里氏替换原则:子类可以替换父类 但是反过来不可以
- is和as关键字
- is:进行类型判断
- as:进行类型转换
二、多态的三种实现方法
1.虚方法:
1.将父类的方法标记为虚方法,就是在父类方法的返回值前加virtual关键字,表示这个方法可以被子类重写。
2.子类重写父类方法,在子类的方法的返回值前加override关键字。
3.父类中的虚方法,子类可以重写,也可以不重写。
4.父类中virtual修饰的方法,可以用于实现该方法共有的功能(比如初始化该方法),然后再子类重写该方法时,使用base关键字调用父类中的该方法。
该类,只需要在需要重写的方法面前 添加virtual,就可以被子类重写,而virtual本身所在的方法也是有意义,可以使用的。
语法:
父类:
public virtual 返回值类型 方法名()
{
方法体代码;
}
子类:
public override 返回值类型 方法名()
{
方法体代码;
}
例子:
class Father //父类
{
public virtual void DaoXiao()
{
Console.WriteLine("学生八点到校")
}
}
class Son:Father //子类
{
public override void DaoXiao(){
Control.WriteLine("老师九点到校");
}
}
Father father=new Son();
father.DaoXiao(); //老师打卡
2、抽象类
父类里面用 virtual 关键字修饰的方法叫做虚方法,子类可以使用override重新该虚方法,也可以不重写。
虚方法还是有方法体的,当我们父类中的这个方法已经虚到完全无法确定方法体的时候,就可以使用另外一种形式来表现,这种形式叫抽象方法。
抽象方法语法
抽象方法的返回值类型前用关键字abstract修饰,且无方法体。
public abstract void Hello();
抽象方法必须存在于抽象类中。
abstract class FuLei
在定义类的关键字class前面加abstract 修饰的类就是抽象类。
子类继承抽象类,使用 override关键字重写父类中所有的抽象方法。
抽象类注意事项
<1>抽象类中不一定要有抽象方法, 但是抽象方法必须存在于抽象类中。
<2>抽象类不能被实例化, 因为抽象类中有抽象方法(无方法体), 如果真能实例化抽象类的话, 调用这些无方法体的方法是没有任何意义的, 所以无法实例化。
使用场景
<1>当父类中的方法不知道如何去实现的时候, 可以考虑将父类写成抽象类,将方法写成抽象方法。
<2>如果父类中的方法有默认实现, 并且父类需要被实例化, 这时可以考虑将父类定义成一个普通类, 用虚方法实现多态。
<3>如果父类中的方法没有默认实现, 父类也不需要被实例化, 则可以将该类定义为抽象类。
例子:
abstract class NPC
{
private string name;
private NPCType type;
public string Name
{
get { return name; }
set { name = value; }
}
public NPCType Type
{
get { return type; }
set { type = value; }
}
public NPC(string name, NPCType type)
{
this.name = name;
this.type = type;
}
public abstract void Speak();
}
class TaskNPC:NPC
{
private string taskInfo;
public TaskNPC(string taskInfo, string name, NPCType type)
: base(name, type)
{//使用base,将name和type传递给父类,进行构造
this.taskInfo = taskInfo;
}
public override void Speak()
{
Console.WriteLine("NPC{0},任务{1}", base.Name, taskInfo);
}
}
虚方法抽象类语法对比