리스코프 대체 원리는 객체지향 디자인의 기본 원칙 중 하나입니다. 이는 디자인의 폐쇄성을 유지하기 위해 "추상화"와 "다형성"을 사용하여 디자인의 정적 구조를 동적 구조로 변경하는 것을 옹호합니다. "추상화"는 언어가 제공하는 기능이고 "다형성"은 상속 의미론에 의해 구현됩니다.
리스코프 대체 원리(LSP)는 1987년 "객체 지향 기술 서밋"(OOPSLA)에서 MIT 컴퓨터 과학 연구소의 Ms. Liskov에 의해 도입되었습니다. 상속은 상위 유형 객체에 대해 증명된 모든 속성이 또한 유지되도록 보장해야 합니다. 하위 유형 개체의 경우).
리스코프 대체 원칙은 주로 상속에 관한 몇 가지 원칙, 즉 상속을 사용해야 하는 경우와 상속을 사용하지 말아야 하는 경우, 그리고 그 기반이 되는 원칙을 설명합니다. Liskov 대체는 원래 상속 재사용의 기초입니다. 이는 기본 클래스와 하위 클래스 간의 관계를 반영하고 열기 및 닫기 원칙을 보완하며 추상화를 달성하기 위한 특정 단계를 규정합니다.
리스코프 치환 원리의 기능
리스코프 치환 원리의 주요 기능은 다음과 같습니다.
1. 리히터 치환 원리는 개폐 원리를 구현하는 중요한 방법 중 하나입니다.
2. 상속에서 상위 클래스를 재정의하여 재사용성이 떨어지는 단점을 극복합니다.
3. 행동의 정확성을 보장합니다. 즉, 클래스 확장으로 인해 기존 시스템에 새로운 오류가 발생하지 않으므로 코드 오류 가능성이 줄어듭니다.
리히터 대체 원리를 구현하는 방법
리히터 대체 원리는 일반적으로 말합니다. 하위 클래스는 상위 클래스의 기능을 확장할 수 있지만 상위 클래스의 원래 기능을 변경할 수는 없습니다. 즉, 하위 클래스가 상위 클래스를 상속할 때 새 기능을 완성하기 위해 새 메서드를 추가하는 것 외에는 상위 클래스의 메서드를 재정의하지 마십시오.
부모 클래스 메서드를 다시 작성하여 새로운 기능을 완성하면 작성은 간단하지만 전체 상속 시스템의 재사용성은 상대적으로 떨어집니다. 특히 다형성을 자주 사용하는 경우 프로그램 실행 오류가 발생할 확률이 매우 높아집니다. 큰.
프로그램이 Liskov 대체 원칙을 위반하면 상속된 클래스의 객체에 기본 클래스가 나타나는 런타임 오류가 발생합니다. 이때 수정방법은 원래의 상속관계를 취소하고 양자간의 관계를 재설계하는 것이다.
리스코프 치환 원리의 예와 관련하여 가장 유명한 것은 "정사각형은 직사각형이 아니다"입니다. 물론, 삶에도 비슷한 예가 많이 있습니다. 예를 들어, 펭귄, 타조, 키위는 생물학적 관점에서는 새로 분류되지만 계급 상속 관계에서는 비행 기능을 하는 "새" 능력을 물려받을 수 없기 때문에 "새"의 하위 클래스로 정의할 수 없습니다. 마찬가지로 "풍선 물고기"는 헤엄칠 수 없기 때문에 "물고기"의 하위 범주로 정의할 수 없으며, "장난감 대포"는 적을 폭파할 수 없으므로 "대포" 등의 하위 범주로 정의할 수 없습니다.
다음은 리히터 치환 원리를 설명하기 위해 "키위는 새가 아니다"를 예로 사용합니다.
【예시 2】"키위는 새가 아니다"의 예에서 리히터 치환 원리를 적용합니다.
분석: 새는 일반적으로 날아갑니다. 예를 들어 제비의 비행 속도는 시속 약 120km입니다. 그러나 뉴질랜드 키위새는 날개가 퇴화되어 날 수 없습니다. 예제를 디자인하고 이 두 마리의 새가 300km를 비행하는 데 걸리는 시간을 계산한다고 가정해 보겠습니다. 분명히 제비를 사용하여 이 코드를 테스트하면 결과가 정확하고 필요한 시간을 계산할 수 있지만 키위를 사용하여 테스트하면 결과는 "0으로 나누기 예외" 또는 "무한대"가 됩니다. 이는 분명히 기대와 일치하지 않습니다. 그림 1에 표시된 클래스 다이어그램입니다.
프로그램 코드는 다음과 같습니다.
package principle; public class LSPtest { public static void main(String[] args) { Bird bird1=new Swallow(); Bird bird2=new BrownKiwi(); bird1.setSpeed(120); bird2.setSpeed(120); System.out.println("如果飞行300公里:"); try { System.out.println("燕子将飞行"+bird1.getFlyTime(300)+"小时."); System.out.println("几维鸟将飞行"+bird2.getFlyTime(300)+"小时。"); } catch(Exception err) { System.out.println("发生错误了!"); } } } //鸟类 class Bird { double flySpeed; public void setSpeed(double speed) { flySpeed=speed; } public double getFlyTime(double distance) { return(distance/flySpeed); } } //燕子类 class Swallow extends Bird{} //几维鸟类 class BrownKiwi extends Bird { public void setSpeed(double speed) { flySpeed=0; } }
프로그램의 실행 결과는 다음과 같습니다.
如果飞行300公里: 燕子将飞行2.5小时. 几维鸟将飞行Infinity小时。
프로그램이 잘못 실행되는 이유는 키위 새가 새의 setSpeed(배속) 메서드를 재정의하고, 이는 리히터의 대체 원리에 위배됩니다. 올바른 접근 방식은 키위의 원래 상속 관계를 취소하고 동물 클래스와 같이 새와 키위의 보다 일반적인 부모 클래스를 정의하는 것입니다. 두 클래스 모두 달릴 수 있습니다. 키위의 비행 속도는 0이지만 달리는 속도는 0이 아닙니다. 300km를 달리는 데 걸리는 시간을 계산할 수 있습니다.
클래스 다이어그램은 그림 2에 나와 있습니다.
더 많은 관련 지식을 보려면 PHP 중국어 웹사이트를 방문하세요!
위 내용은 리히터 대체 원리는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!