虚方法
关键字:virtual
添加关键字virtual之后,会把方法定义为虚方法
实例
public class VirA{
public virtual void VirTest(){
// 这是一个虚方法
}
}
虚方法可以被子类派生,用override重写VirTest
public class VirChild:VirA{
public override void VirTest(){
base.VirTest();
//重写父类的方法
}
}
这样一个简单的重写就完成了
重写之后,还可以通过base.VirTest调用父类原本的代码
override派生过的方法,还可以被继续派生
public class VirGrandson:VirChild{
public override void VirTest(){
base.VirTest();
//重写父类的方法
}
}
VirGrandson——继承——>VirChild——继承——>VirA
特点:
虚方法更容易维护,修改或者维护时,可以不改动底层源码,直接修改它的重写方法
抽象方法
关键字:abstract
添加关键字abstract之后,会把方法定义为抽象方法
抽象方法只能定义在抽象类内
实例
///抽象类
public abstract class AbsParent
{
///抽象方法
public abstract void AbsTest();
}
我们定义了一个抽象类和抽象方法
public class AbsChild: AbsParent
{
public override void AbsTest()
{
//实现抽象类
//无法使用base.AbsTest()
}
}
继承抽象方法不能使用base.AbsTest,因为它没有方法实体
public class AbsGroundSun : AbsChild
{
public override void AbsTest()
{
base.AbsTest();
}
}
还可以再被继承,派生.这个时候可以使用base的方法了,因为我们的AbsChild已经实现了方法主体
特点
抽象方法必须放在抽象类中
抽象方法不能是私有的
抽象类被继承的时候,子类必须实现抽象类里面的所有抽象方法
抽象方法被实现一定是用override关键字,不能用new, (new 相当于是一个新的方法了,和父类的方法都没关系了,没有血缘关系,只是长得像)
抽象类中可以拥有其他类型的方法
和接口的区别
抽象类是单继承的,接口可以多继承
抽象类里面除了抽象方法,还可以写普通方法,虚方法,静态方法,接口只能写规范,不能写方法主体,也不能写别的方法
就像这张图一样,我们只能继承人啊,不能再是猫,狗或者别的物种了
但是接口就像技能一样,有时间就可以学一个新技能
抽象方法和虚方法的区别
抽象方法只写个规范,不写方法实体(可以把它看成一个懒虫,啥也不干)
虚方法有自己的方法主体(就像一个勤劳的农民伯伯),子类继承了它之后还可以调用他的方法(请它出山坐诊,和诸葛亮一样啊,不给退休,干到死)
掰掰