여기에서 필요한 것은 다음과 같은 치환(substitution) 원칙이다. S 타입의 객체 o1 각각에 대응하는 T 타입 객체 o2가 있고, T 타입을 이용해서 정의한 모든 프로그램 P에서 o2의 자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면, S는 T의 하위 타입이다.
이미지 출처 : https://wedonttalknemore.tistory.com/16?category=967824
이미지 출처 : https://wedonttalknemore.tistory.com/16?category=967824
Square는 Rectangle의 하위 타입으로 적합하지 않다.
Rectangle의 높이와 너비는 서로 독립적으로 변경될 수 있는 반면, Square의 높이와 너비는 반드시 함께 변경되기 때문.
User는 대화하고 있는 상대가 Rectangle이라고 생각하므로 혼동이 생길 수 있다.
Rectangle r = ...
r.setW(5);
r.setH(2);
assert(r.area() == 10);
... 코드에서 Square를 생성한다면 assert문은 실패하게 된다.
해결책