虚方法vob
概念
当有一个定义在类中的函数需要在继承类中实现时,可以使用虚方法,虚方法是使用关键字virtual声明的,虚方法可以在不同的继承类中有不同的实现,即为基类中定义的允许在派生类中重写的方法。
虚方法包含:
虚函数:virtual
重写:override
父类:base
声明
访问修饰符 virtual 函数返回类型 函数名(参数表) {函数体};
虚方法规则
1. 虚拟类其实指的是正常类中的虚拟方法,所以虚拟类可以直接使用实例,这是与抽象类不同的一点
2. 虚拟方法是在方法前加virtual关键字,对方法进行声明,说明这个方法为虚方法;
3. 虚拟函数和正常函数无区别;
4. 子类继承虚拟类可以实现虚拟方法也可以不实现虚拟方法;
5. 虚方法可以在不同的继承类中有不同的实现;
注意事项
只有为虚方法时可以进行重写,不能对非虚方法进行重写;
虚方法在形式上在方法名前加virtual修饰;
虚方法一般在基类定义,在派生类中实现具体操作,派生类实现该方法时,要用override对其方法进行修饰;
当用virtual修饰后,不允许再有 static、abstract 或者 override 修饰符;
作用
允许 子类 / 派生类 进行重写;
增加代码的可维护性,脉络较清淅有条理
实例
class Program
{
static void Main(string[] args)
{
Gameobject[] objs = new Gameobject[5];
objs[0] = new Gameobject("A");
objs[1] = new Player("B");
objs[2] = new Player("C");
objs[3] = new Monster("D");
objs[4] = new Monster("E");
for(int i = 0; i < objs.Length; i++)
{
objs[i].Attack();
}
}
public class Gameobject//父类
{
public string name;
public Gameobject(string name)
{
this.name = name;
}
public virtual void Attack()//虚函数
{
Console.WriteLine(name + "蓄力");
}
}
public class Monster : Gameobject//子类1
{
public Monster(string name) : base(name)
{
}
public override void Attack()//重写
{
base.Attack();//保留父类行为
Console.WriteLine(name + "攻击");
}
}
public class Player : Gameobject//子类2
{
public Player(string name) : base(name)
{
}
public override void Attack()
{
Console.WriteLine(name + "发动技能");
}
}
}
运行
总结
利用里氏替换原则用子类容器装载子类对象时,最终调用的是父类容器中的Atk方法,但是由于使用vo多态,所以最终我们调用的方法其实是子类中重写的方法。
virtual,override 体现出 同一类型对象,执行相同行为,有不同的表现。
base对于我们来说,可以保留父类行为,进行逻辑拓展。