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