C# 抽象类(abstract)_c# 抽象类的作用
抽象类的定义与特性
C# 抽象类是特殊的类,不能被实例化,但具有类的其他特性。抽象类使用 `abstract` 关键字来声明,它可以包含抽象方法、虚方法、常规方法、属性、构造方法、普通成员变量和静态成员变量等。`abstract` 修饰符指示被修改内容的实现已丢失或不完整,该修饰符可用于类、方法、属性、索引和事件。在类声明中使用 `abstract` 修饰符来指示某个类仅用作其他类的基类。
抽象类与抽象方法的关系
抽象方法的特点
抽象方法是一种没有实现的方法,只有定义和声明,没有具体实现。它只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。抽象方法可以看成是没有实现体的虚方法,并且必须被声明为 `public`,因为派生类必须可以访问它。
抽象类与抽象方法的约束
抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类。具体派生类必须覆盖基类的抽象方法;抽象派生类可以覆盖基类的抽象方法,也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
抽象类的使用场景
代码复用
在类库中定义通用的抽象类作为基类,派生出具体的子类,可以提高代码的复用性,避免代码重复。抽象类中的普通方法可以被多个子类共享,避免重复编写相同的代码。例如,在开发中,不需要为每个动物单独定义睡觉的方法,只需要在抽象类里定义一次,而每个动物只需专注于实现自己的特定行为(如叫声)。
多态
在多态的环境下,使用抽象类和抽象方法定义统一的虚方法,可以让子类实现这些方法,减少繁琐的类型转换操作。比如在创建一系列形状的类(如矩形、圆形、三角形等)时,使用抽象类定义它们的通用属性和行为(如颜色、周长、面积等),具体的形状类继承自该抽象类并实现其抽象属性和方法,通过抽象类的引用调用子类的实现,实现多态。
强制行为一致性
通过抽象方法,确保所有子类都有某些关键的行为。例如,虽然每个动物都会发出声音,但它们发出的声音是不一样的,通过在抽象类中定义抽象的发声方法,确保每个继承该抽象类的动物子类都必须实现发声行为。
灵活扩展
未来如果增加新的动物种类,只需继承抽象类并实现抽象方法,而无需修改原有的代码,使代码更具扩展性和可维护性。
抽象类与其他概念的对比
与普通类的区别
普通类可以被实例化,而抽象类不能被实例化。并且普通类不能包含抽象方法,而抽象类可以包含抽象方法。
与接口的区别
- 成员实现:抽象类可以包含已实现的方法,而接口中的所有方法在 C# 8.0 之前都必须是未实现的(C# 8.0 引入了默认接口方法)。抽象类可以包含字段和构造函数,而接口不能。
- 继承与实现:一个类只能继承一个抽象类,但可以实现多个接口。抽象类是概念的抽象,接口注重行为。抽象类不支持多重继承,而一个类可以实现多个接口。
- 成员修饰符:抽象类的成员可以使用公有或其他修饰符,接口中成员是隐式公有的,不需要修饰。