설명을 위해 먼저 첫 번째 방법을 사용한 예를 살펴보고, 두 번째 방법은 또 다른 원리로 설명한다. 직사각형과 정사각형의 유명한 예를 살펴보겠습니다. 직사각형 클래스의 경우 길이와 너비가 같으면 정사각형이므로 직사각형 클래스의 객체에는 정사각형 객체가 있습니다. 정사각형 클래스의 경우 해당 메소드에는 setSide 및 getSide가 포함됩니다. 이는 직사각형의 하위 클래스가 아니며 직사각형은 LSP를 준수하지 않습니다.
예:
사각형 클래스:
공용 클래스 Rectangle{
...
setWidth(int 너비){
this.width=width;
}
setHeight(int height){
this.height=height< /p>
}
}
Square 클래스:
공개 클래스 Square{
...
setWidth(int 너비){
this.width=width;
this.height=width;
}
setHeight(int height){
this.setWidth(height);
}
}
변의 길이를 변경하는 함수 예에서 :
public void resize(Rectangle r){
while(r.getHeight()<=r.getWidth){
r.setHeight (r.getWidth+1);
}
}
그렇다면 정사각형이 직사각형의 하위 클래스로 처리되면 어떻게 될까요? 정사각형이 직사각형에서 상속되도록 한 다음 너비나 높이에 값이 할당되는 한 너비와 높이가 동시에 할당되도록 합니다. square 클래스, 너비 및 높이는 항상 동일합니다. 이제 메소드가 있는 클라이언트 클래스가 있다고 가정합니다. 규칙은 다음과 같습니다. 들어오는 직사각형의 너비가 높이보다 큰지 테스트합니다. 그렇지 않으면 너비 값을 늘립니다. 이제 기본 클래스 직사각형이 전달되면 이것이 잘 작동하는지 살펴보겠습니다. LSP에 따르면 기본 클래스를 하위 클래스로 대체하면 결과는 같아야 하지만 사각형 클래스의 너비와 높이가 동시에 할당되므로 조건이 항상 충족되며 이 방법은 그렇지 않습니다. 즉, 하위 클래스화 후에 프로그램의 동작이 변경되어 LSP를 만족하지 않습니다.
그런 다음 첫 번째 솔루션을 사용하여 추상 사각형 클래스를 구성하고 직사각형과 정사각형의 가장 동일한 동작을 이 사변형 클래스에 넣은 다음 직사각형과 정사각형이 동일한 동작을 갖도록 합니다. 문제는 괜찮습니다. 직사각형과 정사각형의 경우 너비와 높이를 취하는 것이 가장 일반적인 동작이지만 너비와 높이에 값을 할당하는 것은 다른 동작을 갖습니다. 따라서 이 추상 사각형 클래스에는 값 메서드만 있고 할당 메서드가 없습니다. 위의 예에서 메서드는 다른 하위 클래스에만 적용되며 LSP는 손상되지 않습니다.