「リスコフの置換原則」について、
Googleで一番上にくる検索結果だと
「継承に関する原則で、親クラスのインスタンスが適用されるコードに対して、子クラスのインスタンスで置き換えても、問題なく動くべきだという原則」 と記載されていました。
また、別の「リスコフの置換原則」について説明しているサイトでは、違反しているサンプルとして以下の様な、子クラスでExceptionを投げるような実装の記載がありました。
Java
1public class Rectangle { 2 private int width; 3 private int height; 4 5 public int getWidth() { 6 return width; 7 } 8 9 public void setWidth(int width) { 10 this.width = width; 11 } 12 13 public int getHeight() { 14 return height; 15 } 16 17 public void setHeight(int height) { 18 this.height = height; 19 } 20 21} 22 23class Square extends Rectangle { 24 public void setWidth(int width) { 25 throw new AssertionError("please use setSize method"); 26 } 27 public void setHeight(int height) { 28 throw new AssertionError("please use setSize method"); 29 } 30 31 public void setSize(int size) { 32 super.setWidth(size); 33 super.setHeight(size); 34 } 35}
Wikipediaでは
「サブタイプのオブジェクトはスーパータイプのオブジェクトの仕様に従わなければならない」 と記載されていました。
ここで質問なのですが、以下の様なインターフェースを実装している場合も「リスコフの置換原則に違反している」と言えると思うのですが、あっていますでしょうか?
java
1public interface Rectangle { 2 public void setWidth(int width); 3 public void setHeight(int height); 4 5} 6 7class Square implements Rectangle { 8 9 @Override 10 public void setWidth(int width) { 11 throw new AssertionError("please use setSize method"); 12 } 13 14 @Override 15 public void setHeight(int height) { 16 throw new AssertionError("please use setSize method"); 17 } 18 19}
回答2件
あなたの回答
tips
プレビュー