我在理解这两个原则时遇到了一些麻烦。这是一个有点长的阅读问题,所以请耐心等待。
假设我们有一个类
abstract class Shape {
abstract void onDraw();
}
和界面
interface SideCountable {
int getSidesCount();
}
然后我们创建两个子类
class Quad extends Shape {
@Override
public void onDraw() {
//some draw logic here
}
}
class Triangle extends Shape {
@Override
public void onDraw() {
//some draw logic here
}
}
现在我们将制作Shape
工具SideCountable
abstract class Shape implements SideCountable{
abstract void onDraw();
}
并改变儿童班
class Quad extends Shape {
@Override
public int getSidesCount() {
return 4;
}
@Override
public void onDraw() {
//some draw logic here
}
}
class Triangle extends Shape {
public int getSidesCount() {
return 3;
}
public void onDraw() {
//some draw logic here
}
}
并为此结构创建测试函数(遵循 LSP):
public void printSidesCount(List<Shape> shapes) {
for(int i=0; i < shapes.size(); i++) {
System.out.println(shapes.get(i).getSidesCount());
}
}
在这里我想停下来,因为实际上在下一步我被卡住了。如果我们要创建第三类Circle
怎么办?
class Circle extends Shape {
public int getSidesCount() {
return ???;
}
@Override
public void onDraw() {
//some draw logic here
}
}
圆没有边,所以SideCountable
为这个孩子执行听起来很荒谬。好的,我们只能将实现移动到四边形和三角形,但在这种情况下,LSP 将不再工作。有人可以描述我应该做的最好的方法吗?
- 留
SideCountable
类Shape
归0为Circle
打破接口隔离原则? - 迁移
SideCountable
到Quad
打破Triangle
LSP原理?