转载自微软官方文档:
https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/abstract
1.abstract
abstract
修饰符指示被修改内容的实现已丢失或不完整。 abstract 修饰符可用于类、方法、属性、索引和事件。 在类声明中使用 abstract
修饰符以指示某个类仅旨在作为其他类的基类。
标记为 abstract 的成员,或包含在抽象类中的成员,都必须由派生自抽象类的类来实现。
抽象类具有以下功能:
-
抽象类不能实例化。
-
抽象类可能包含抽象方法和访问器。
-
无法使用 sealed 修饰符来修改抽象类,因为两个修饰符具有相反的含义。
sealed
修饰符阻止类被继承,而abstract
修饰符要求类被继承。 -
派生自抽象类的非抽象类,必须包含全部已继承的抽象方法和访问器的实际实现。
在方法或属性声明中使用 abstract
修饰符,以指示该方法或属性不包含实现。
抽象方法具有以下功能:
-
抽象方法是隐式的虚拟方法。
-
只有抽象类中才允许抽象方法声明。
-
由于抽象方法声明不提供实际的实现,因此没有方法主体;方法声明仅以分号结尾,且签名后没有大括号 ({ })。
public abstract void MyMethod();
-
实现由方法 override 提供,它是非抽象类的成员。
-
在抽象方法声明中使用 static 或 virtual 修饰符是错误的在静态属性上使用
abstract
修饰符是错误的。 通过包含使用 override 修饰符的属性声明,可在派生类中重写抽象继承属性。 -
抽象类必须为所有接口成员提供实现。
实现接口的抽象类有可能将接口方法映射到抽象方法上。 例如:
interface I { void M(); } abstract class C : I { public abstract void M(); }
2.sealed
应用于某个类时,sealed
修饰符可阻止其他类继承自该类。
将 abstract 修饰符与密封类结合使用是错误的,因为抽象类必须由提供抽象方法或属性的实现的类来继承。
对基类中的虚方法或属性的方法或属性使用 sealed
修饰符。 这使你可以允许类派生自你的类并防止它们替代特定虚方法或属性。
3.virtual
virtual 关键字用于修改方法、属性、索引器或事件声明,并使它们可以在派生类中被重写
不能使用virtual
修饰符与static
, abstract
, private
,或override
修饰符。