この 2 つの原則を理解するのに苦労しています。これは少し長文の質問なので、しばらくお待ちください。
クラスがあるとしましょう
abstract class Shape {
abstract void onDraw();
}
とインターフェース
interface SideCountable {
int getSidesCount();
}
そして、2 つの子クラスを作成します。
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());
}
}
そして、ここでやめたいと思います。なぜなら、実際には次のステップで立ち往生したからです。3 番目のクラスを作成するとどうなるでしょうCircle
か。
class Circle extends Shape {
public int getSidesCount() {
return ???;
}
@Override
public void onDraw() {
//some draw logic here
}
}
Circle には側面がないため、SideCountable
for this children の実装はばかげているように聞こえます。わかりました。実装を Quad と Triangle のみに移動できますが、この場合、LSP は機能しなくなります。誰かが私がすべき最善の方法を説明できますか?
- クラスに残し
SideCountable
て0を返し、インターフェイスの分離原則を破りますか?Shape
Circle
- 移行
SideCountable
しQuad
てTriangle
LSP の原則を破りますか?