리스코프 대체 원리
리스코프 대체 원리 LSP는 기본 클래스와 하위 클래스 간의 관계에 대해 이야기합니다. 이 관계가 존재할 때만 리히터 대체 관계가 존재합니다. 두 특정 클래스 A와 B 사이의 관계가 LSP의 설계를 위반하는 경우(B에서 A로의 상속 관계라고 가정) 특정 상황에 따라 다음 두 가지 재구성 솔루션 중 하나를 선택할 수 있습니다.
<?php //举例说明继承的风险,我们需要完成一个两数相减的功能,由类A来负责。 class a{ public $width; public $height; public function func1($a, $b){ return $a - $b; } } $a = new a(); echo $a->func1(100,50); //运行结果100-50=50
나중에 새 함수를 추가해야 합니다. 두 숫자의 더하기를 완료한 다음 그 값을 100으로 합산해야 합니다. 클래스 B가 이를 담당합니다. 즉, 클래스 B는 두 가지 기능을 완료해야 합니다.
클래스 B를 사용하여 클래스 A를 상속하는 코드는 다음과 같습니다.
class b extends a{ public function func1($a, $b){ return $a + $b; } public function func2($a, $b){ return $this->func1($a, $b) + 100; } } $b = new b(); echo $b->func2(100, 50);
클래스 B가 메서드 이름을 지정할 때 실수로 부모 클래스의 메서드를 다시 작성하여 모든 오류가 발생한다고 가정합니다. 뺄셈 함수를 실행하는 코드입니다. 클래스 B의 다시 작성된 메소드가 호출되어 원래 정상적으로 실행되고 있던 fun1 함수에서 오류가 발생했습니다. (오류의 원인은 뺄셈이 덧셈으로 변경되어 다른 사용자가 이를 몰랐기 때문입니다. 항상 코드가 한 사람에 의해 작성되었다고 생각하지 마십시오.) 그리고 사람들은 코드를 한 줄씩 읽을 시간이 없으며 단지 규칙에 따라 적용합니다.
일반인의 관점에서 보면 리히터 대체 원칙은 다음과 같습니다. 하위 클래스는 상위 클래스의 기능을 확장할 수 있지만 상위 클래스의 원래 기능을 변경할 수는 없습니다. 다음 4가지 의미 수준을 포함합니다.
1. 하위 클래스는 상위 클래스의 추상 메서드를 구현할 수 있지만 상위 클래스의 비추상 메서드를 재정의할 수는 없습니다.
2. 서브클래스에 고유한 메서드를 추가할 수 있습니다.
3. 하위 클래스의 메서드가 상위 클래스의 메서드를 재정의하는 경우 메서드의 전제 조건(즉, 메서드의 형식 매개 변수)은 상위 클래스 메서드의 입력 매개 변수보다 느슨합니다.
4. 하위 클래스의 메서드가 상위 클래스의 추상 메서드를 구현할 때 메서드의 사후 조건(즉, 메서드의 반환 값)은 상위 클래스의 사후 조건보다 더 엄격합니다.
우리 프로그래밍에서 Liskov 대체 원칙을 자주 위반하는 것을 발견하기 때문에 믿을 수 없을 것 같지만 프로그램은 여전히 잘 실행됩니다. 그래서 모든 사람은 이 질문을 할 것입니다. 내가 Liskov 대체 원칙을 따르지 않는다고 주장하면 결과는 어떻게 될까요?
결과적으로, 작성한 코드에 문제가 발생할 가능성이 크게 높아집니다.
위 내용은 리히터의 대체 원리는 무엇입니까? (예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!