虚方法
将一个基类函数声明为virtual,就可以在任何派生类中重写该函数。
class MyBaseClass{
public virtual string VirtualMethod(){
return "Method is called in base class."
}
}
在派生类中进行重写该函数时,需要使用override关键字显示声明
class MyDerivedClass : MyBaseClass{
public override string VirtualMethod(){
return "Method is called in derived class."
}
}
需要注意的是,当在子类中重写虚函数之后,不管在哪里进行调用,调用的都是重写后的方法(相当于原先的方法被重写后的方法给覆盖了)。
隐藏方法
如果签名相同的方法在基类和派生类中都进行了声明,但是该方法并没有分别声明virtual和override,这是派生类就会隐藏基类方法(可以使用new关键字进行声明)
一个方法的签名即为一个方法的定义,例如返回值、参数、方法名等。
隐藏和重写的区别:
隐藏:只是将父类中的方法给隐藏了,实际这个方法还存在。
重写:将原先父类中的方法完全重写了,原先的方法是不存的了。
//隐藏方法:如果使用子类声明的对象,则调用隐藏方法会调用子类的;如果使用父类声明的对象,则会调用父类中的隐藏方法。
//父类:Enemy
//子类:Boss
//Move()是一个隐藏方法
class Enemy{
public string Move(){
return "This is Move from Enemy!";
}
}
class Boss : Enemy{
public new string Move(){
return "This is Move from Boss!";
}
}
Boss boss = new Boss();
boss.Move(); //This is Move from Boss!
Enemy boss = new Boss();
boss.Move(); //This is Move from Enemy!
//构造一样,但是声明不一样,调用的隐藏方法也是不一样的。
一般不去使用隐藏方法,因为很容易引起方法调用的混乱。