C#关键字扫盲——abstract 抽象

abstract

abstract
官方描述:abstract修饰符指示被修改内容的实现已丢失或不完整。 abstract 修饰符可用于类、方法、属性、索引和事件。 在类声明中使用 abstract 修饰符以指示某个类仅旨在作为其他类的基类。 标记为 abstract 的成员,或包含在抽象类中的成员,都必须由派生自抽象类的类来实现。


项目源码地址:https://gitee.com/michel4liu/LearnCSharp.git
项目:LearnAbstract
环境VS2017 .NET Core2.0


特性1:抽象类中可以有抽象方法和已实现方法

abstract class Father  //定义abstract Father  
{
    public Father()
    {
        Console.WriteLine($"{nameof(Father)}.构造函数");
    }

    public void OnCall()
    {
        Console.WriteLine("OnCall...");
    }

    public abstract void DoSomething();
}

class Son : Father //继承 abstract  Father 
{
    public override void DoSomething()
    {
        Console.WriteLine($"{nameof(Son)}.Learn");
    }
}

static void Main(string[] args)
{
    Son s = new Son();
    s.DoSomething();
    s.OnCall();

    Console.ReadKey();
}

//输出内容如下
Father.构造函数
Son.Learn
OnCall...

输出1(“Father.构造函数”)表示实例化时抽象类也会被执行构造函数同正常基类一样。

抽象类必须为继承的所有接口成员提供实现,可直接实现或抽象实现

错误用法1: 抽象类无法对构造函数添加 abstract 修饰符

错误用法2: 继承抽象类 必须实现所有抽象方法、属性、索引和事件,也不能通过new修饰符修改唯一的实现方法。

补充上图 如果已经有一个实现方法,可以写同名重载无需加override,加了编译器会报错


注意点 抄自MSDN

  1. 只有抽象类中才允许抽象方法声明。
  2. 由于抽象方法声明不提供实际的实现,因此没有方法主体;方法声明仅以分号结尾,且签名后没有大括号。
  3. 在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
  4. 无法使用 sealed 修饰符来修改抽象类,因为两个修饰符具有相反的含义。 sealed 修饰符阻止类被继承,而 abstract 修饰符要求类被继承。
  5. 派生自抽象类的非抽象类,必须包含全部已继承的抽象方法和访问器的实际实现。

猜你喜欢

转载自blog.csdn.net/michel4liu/article/details/79647938