【CSharp】抽象类和接口详解
本文最后更新于 2025-05-17,文章可能存在过时内容,如有过时内容欢迎留言或者联系我进行反馈。
抽象类(Abstract Class)
概念
不能实例化:抽象类不能被实例化,它通常作为基类存在,为子类提供一套通用的接口和部分实现。
包含实现:抽象类可以包含具体的方法实现和抽象方法。抽象方法必须在子类中被重写。
单继承:一个类只能继承自一个抽象类(C#中不支持多重继承)。
应用场景
当你希望提供一个通用的基类,该基类定义了一些子类共有的方法实现,并且还有一些方法需要由子类提供具体实现时,使用抽象类是一个不错的选择。
示例
示例1:图形基类
说明:
Shape
类是一个抽象类,包含一个抽象方法Area()
和一个具体方法Display()
。
Circle
和Rectangle
类继承自Shape
,并实现了Area()
方法。
示例2:动物基类
说明:
Animal
类定义了共有的行为Sleep()
,并要求子类实现MakeSound()
方法。
接口(Interface)
概念
完全抽象:接口只能包含方法、属性、事件、索引器的声明,不能包含任何实现。
多实现:一个类可以实现多个接口,实现接口即需要实现其所有成员。
成员默认是公共的:接口成员默认是公共的,不能包含访问修饰符。
应用场景
当你希望定义一组不相关类之间的通用行为契约,并且不涉及实现细节时,接口是最好的选择。
示例
示例1:可绘制和可变形
说明:
IDrawable和ITransformable是两个接口,定义了绘制和变形的行为。
TransformableShape类实现了这两个接口,必须提供所有方法的实现。
示例2:数据存储接口
抽象类与接口的组合使用
有时,我们可以将抽象类和接口结合起来使用,以充分利用它们的优势。
示例:动物行为
说明:
Animal
是一个抽象类,定义了所有动物的共有行为。
IMovable
和IFlyable
是接口,定义了可移动和可飞行的行为。
Dog
类继承自Animal
并实现了IMovable
接口。Bird
类继承自Animal
并实现了IMovable
和IFlyable
接口。
总结
抽象类和接口的区别
组合使用场景
结合优势:抽象类提供基础实现,接口扩展额外功能。
示例:
Animal
抽象类定义Eat()
和Breathe()
。
IMovable
和IFlyable
接口分别定义移动和飞行能力。
Dog
继承Animal
并实现IMovable
。
Bird
继承Animal
并实现IMovable
和IFlyable
。
何时选择?
抽象类:聚焦于代码复用和层次化设计,适合“是什么”(Is-A)关系。
接口:聚焦于行为契约和功能扩展,适合“能做什么”(Can-Do)关系。
组合使用:通过抽象类提供基础能力,接口扩展多样化功能,实现灵活设计。
- 感谢你赐予我前进的力量