抽象方法(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后,接口允许有默认实现,会改变很多认知

选择还是以:

  • 抽象类表述的对象
  • 接口表述的是行为和规则
  • 更多时候,选择接口就对了,除非有代码想复用(值得商榷)