当基类将方法声明为 virtual 时,派生类可以用自己的实现重写该方法。 如果基类将成员声明为 abstract,则在直接继承自该类的任何非抽象类中都必须重写该方法。 如果派生类自身是抽象的,则它继承抽象成员而不实现它们。 抽象成员和虚成员是多态性的基础,多态性是面向对象的编程的第二个主要特性。 有关更多信息,请参见 多态性(C# 编程指南)。
如果希望禁止通过 new关键字直接进行实例化,可以将类声明为abstract 如果这样做,则仅当从该类派生新类时才能使用该类。 抽象类可以包含一个或多个自身声明为抽象的方法签名。 这些签名指定参数和返回值,但没有实现(方法体)。 抽象类不必包含抽象成员;但是,如果某个类确实包含抽象成员,则该类自身必须声明为抽象类。 自身不是抽象类的派生类必须为抽象基类中的任何抽象方法提供实现。 有关更多信息,请参见 抽象类、密封类及类成员(C# 编程指南)。
“接口”是一种引用类型,有点像仅包含抽象成员的抽象基类。 类在从接口实现时必须为该接口的所有成员提供实现。 类虽然只能从一个直接基类派生,但可以实现多个接口。
接口用于为不一定具有“是”关系的类定义特定功能。 例如,System.IEquatable<T> 接口可由任何类或构造实现,这些类或构造必须启用代码来确定该类型的两个对象是否等效(但是该类型定义等效性)。 IEquatable<T> 不表示基类和派生类之间存在的同一种“是”关系(例如 Mammal 是 Animal)。 有关更多信息,请参见 接口(C# 编程指南)。
类可以将自身或其成员声明为 sealed,从而禁止其他类从该类自身或其任何成员继承。 有关更多信息,请参见 抽象类、密封类及类成员(C# 编程指南)。