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

在此示例中,类 Square 必须提供 GetArea 的实现,因为它派生自 Shape

abstract class Shape
    public abstract int GetArea();
class Square : Shape
    private int _side;
    public Square(int n) => _side = n;
    // GetArea method is required to avoid a compile-time error.
    public override int GetArea() => _side * _side;
    static void Main()
        var sq = new Square(12);
        Console.WriteLine($"Area of the square = {sq.GetArea()}");
// Output: Area of the square = 144

抽象类具有以下功能:

  • 抽象类不能实例化。

  • 抽象类可能包含抽象方法和访问器。

  • 无法使用 sealed 修饰符来修改抽象类,因为两个修饰符的含义相反。 sealed 修饰符阻止类被继承,而 abstract 修饰符要求类被继承。

  • 派生自抽象类的非抽象类,必须包含全部已继承的抽象方法和访问器的实际实现。

    在方法或属性声明中使用 abstract 修饰符,以指示该方法或属性不包含实现。

    抽象方法具有以下功能:

  • 抽象方法是隐式的虚拟方法。

  • 只有抽象类中才允许抽象方法声明。

  • 由于抽象方法声明不提供实际的实现,因此没有方法主体;方法声明仅以分号结尾,且签名后没有大括号 ({ })。 例如:

    public abstract void MyMethod();  
    

    实现由方法 override 提供,它是非抽象类的成员。

  • 在抽象方法声明中使用 staticvirtual 修饰符是错误的。

    除了声明和调用语法方面不同外,抽象属性的行为与抽象方法相似。

  • 在静态属性上使用 abstract 修饰符是错误的。

  • 通过包含使用 override 修饰符的属性声明,可在派生类中重写抽象继承属性。

    有关抽象类的详细信息,请参阅抽象类、密封类及类成员

    抽象类必须为所有接口成员提供实现。

    实现接口的抽象类有可能将接口方法映射到抽象方法上。 例如:

    interface I
        void M();
    abstract class C : I
        public abstract void M();
    

    在此示例中,类 DerivedClass 派生自抽象类 BaseClass。 抽象类包含抽象方法 AbstractMethod,以及两个抽象属性 XY

    // Abstract class
    abstract class BaseClass
        protected int _x = 100;
        protected int _y = 150;
        // Abstract method
        public abstract void AbstractMethod();
        // Abstract properties
        public abstract int X { get; }
        public abstract int Y { get; }
    class DerivedClass : BaseClass
        public override void AbstractMethod()
            _x++;
            _y++;
        public override int X   // overriding property
                return _x + 10;
        public override int Y   // overriding property
                return _y + 10;
        static void Main()
            var o = new DerivedClass();
            o.AbstractMethod();
            Console.WriteLine($"x = {o.X}, y = {o.Y}");
    // Output: x = 111, y = 161
    

    在前面的示例中,如果你尝试通过使用如下语句来实例化抽象类:

    BaseClass bc = new BaseClass();   // Error  
    

    将遇到一个错误,告知编译器无法创建抽象类“BaseClass”的实例。

    C# 语言规范

    有关详细信息,请参阅 C# 语言规范。 该语言规范是 C# 语法和用法的权威资料。

  • virtual
  • override
  • C# 关键字
  • 即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:https://aka.ms/ContentUserFeedback

    提交和查看相关反馈

  •