抽象方法(abstract)、虚方法(virtual)及接口(interface)
抽象方法(abstract)
定义:abstract关键词标记的方法——抽象方法
特征:
- 抽象方法只能定义在抽象类里
- 没有方法体,只能通过子类重写实现功能
- 不能被所在的类直接调用,因为抽象类不能被实例化
- 抽象类的子类必须用override重写抽象类里的抽象方法(可以说抽象方法的目的就是为了重写)
- 抽象方法不能说private私有的(因为要被继承)
抽象类里可以拥有其他非抽象方法(普通方法、虚方法)
///抽象类
public abstract class AbsParent
{
///抽象方法
public abstract void AbsTest();
}
虚方法(virtual)
关键字virtual之后,会把方法定义为虚方法
特征:
- 可以定义在普通类或者抽象类里
- 子类不一定非要重写(因为它有方法体能实现功能了)
- 虚方法重写(派生)过的方法,还能继续(被子类的子类)派生(重写)
class A
{
public virtual void MethodA()
{
Console.WriteLine("Virtual Method A");
}
}
多层派生
///父类
public abstract class AbsParent
{
///抽象方法
public abstract void AbsTest();
}
//子类
public class AbsChild: AbsParent
{
public override void AbsTest()
{
//实现抽象类
//无法使用base.AbsTest()
}
}
//孙子类
public class AbsGroundSun : AbsChild
{
public override void AbsTest()
{
//这里可以使用base了,因为AbsChild已经实现了方法主体
base.AbsTest();
}
}
接口类(interface)
- 抽象类是单继承的,接口可以多继承
- 抽象类里面除了抽象方法,还可以写普通方法,虚方法,静态方法
- 接口只能写规范,不能写方法主体,也不能写别的方法
抽象类和接口的选择
功能侧重
抽象类:(父类只有一个) 继承+约束: 主要是继承,约束是副业 is a---抽象
类表述的对象。抽象类里可以没有抽象方法
接口: (接口可以多个) 只是做约束 can do,就可以跨不同类型 ----接口表
述的是行为,以及规则
选型
C#8.0后,接口允许有默认实现,会改变很多认知
选择还是以:
- 抽象类表述的对象
- 接口表述的是行为和规则
- 更多时候,选择接口就对了,除非有代码想复用(值得商榷)