从“动物世界”看SOLID:当鸵鸟继承鸟类时发生了什么灾难?
想象一下,你正在设计一个动物园管理系统。系统里有一个Bird类,所有鸟类都继承自它。企鹅、麻雀、鸵鸟都是Bird的子类。看起来一切都很合理,直到有一天,你在代码里调用bird.fly()时,鸵鸟对象抛出了一个异常——因为鸵鸟根本不会飞!这就是典型的面向对象设计陷阱,也是我们今天要讨论的SOLID原则中**里氏替换原则(LSP)**的经典反例。
1. 动物园里的继承灾难
在面向对象编程中,继承是最容易被滥用的特性之一。让我们用Java代码还原这个动物园场景:
class Bird {
public void fly() {
System.out.println("展翅高飞!");
}
public void eat() {
System.out.println("啄食中...");
}
}
class Ostrich extends Bird {
@Override
public void fly() {
throw new UnsupportedOperationException("鸵鸟不会飞!");
}
}
这段代码的问题在于:当其他代码期望一个Bird对象能飞时,传入Ostrich会导致程序崩溃。这违反了LSP原则——子类应该能够替换父类而不破坏程序行为。
常见继承误区的代价:
- 系统出现意料之外的运行时异常
- 代码可维护性下降(需要大量instanceof检查)
- 单元测试复杂度激增
2. SOLID原则的动物王国解读
SOLID原则就像动物园的管理规范,确保每种"动物"(类)都能和谐共处。让我们用动物世界的例子解析这五大原则:
2.1 单一职责原则(SRP)
火烈鸟的启示:
// 违反SRP的反例
class Flamingo {
void filterFeed() { /* 滤食行为 */ }
void balanceOnOneLeg() { /* 单腿站立 */ }
void generatePinkPigment() { /* 生成粉色色素 */ }
}
// 符合SRP的正解
class FlamingoFeeder {
void filterFeed() { /* 只负责滤食 */ }
}
class FlamingoBalancer {
void balan

368

被折叠的 条评论
为什么被折叠?



