什么时候用抽象类
发布时间:2026-10-08 09:57:19
来源:亿速云
阅读:93
作者:小樊
栏目:编程语言
在面向对象编程(如 Java、C#、C++ 等)中,抽象类(abstract class)主要用于“抽取共性、约束子类、不能单独实例化”的场景。下面从使用时机、典型场景、与接口的区别三个角度说明。
一、什么时候应该用抽象类
1. 多个类有大量公共代码(属性和方法实现)
如果一些子类有很多重复逻辑,应把公共部分放到抽象类中,避免代码重复。
例子:
abstract class Animal {
String name;
void sleep() {
System.out.println(name + " is sleeping");
}
abstract void sound(); // 子类必须实现
}
Dog 和 Cat 都能复用 sleep()。
2. 需要控制子类的创建方式
抽象类不能被 new,能保证:
使用者必须通过具体子类使用
子类必须遵守某种结构
3. 既想定义“规范”,又想提供“默认实现”
接口只能定义行为(Java 8 前),抽象类可以:
定义抽象方法(强制实现)
提供普通方法(直接复用)
4. 类之间有明显的**“是一个(is-a)”关系**
抽象类适合表达继承体系:
Animal ← Dog
Shape ← Circle
如果是“能做什么”(has-a / can-do),更适合用接口。
二、典型使用场景
✅ 场景 1:模板方法模式
abstract class Game {
void play() {
start();
playGame();
end();
}
abstract void playGame();
}
✅ 场景 2:基础服务类
如:
BaseController
BaseService
AbstractRepository
✅ 场景 3:业务实体继承
abstract class Account
abstract class BankAccount extends Account
abstract class CreditAccount extends Account
三、抽象类 vs 接口(什么时候不用抽象类)
场景
用抽象类
用接口
需要代码复用
✅
❌
需要多继承
❌
✅
定义能力/契约
❌
✅
表达“是什么”
✅
❌
表达“能做什么”
❌
✅
四、一句话总结
当多个类“是一类东西”,并且有共同实现逻辑时,用抽象类;
当只关心“能做什么”,用接口。
如果你有具体语言(Java / C# / Python)或业务场景,我可以给你更贴切的例子。