디자인 모델 6 대 원칙: 리 씨 교체 원칙 (5)
7649 단어 디자인 모드대상 을 향 하 다
리 씨 교체 원칙 은 매사 추 세 츠 공과 대학 (MIT) 컴퓨터 과학 실험실 의 Liskov 여사 가 1987 년 OOPSLA 대회 에서 발표 한 글 인 에서 제시 한 것 으로 상속 과 관련 된 몇 가지 원칙, 즉 언제 상속 을 사용 해 야 하 는 지, 언제 상속 을 사용 해 서 는 안 되 는 지 를 논술 했다.그리고 그 안에 담 겨 있 는 원리.2002 년 에 우리 가 앞에서 단일 직책 원칙 에서 언급 한 소프트웨어 공학 의 대가 로 버 트 C. 마 틴 은 을 출판 했다. 글 에서 그 는 리 씨 의 대체 원칙 을 최종 적 으로 'Subtypes must be substitutable for their base types' 로 간략화 했다.즉, 자 류 는 반드시 그들의 기류 로 바 꿀 수 있어 야 한다.우 리 는 리 씨 의 교체 원칙 을 좀 더 완전 하 게 설명 했다. 한 소프트웨어 시스템 에서 하위 클래스 는 모든 기본 클래스 가 나타 날 수 있 는 곳 을 교체 할 수 있 고 교 체 를 거 친 후에 코드 는 정상적으로 작 동 할 수 있어 야 한다.
정의 1: 모든 유형 이 T1 인 대상 o1 에 대해 T2 인 대상 o2 가 있 으 면 T1 으로 정 의 된 모든 프로그램 P 가 모든 대상 o1 에서 o2 로 대 체 될 때 프로그램 P 의 행동 에 변화 가 없 으 면 유형 T2 는 유형 T1 의 하위 유형 입 니 다.정의 2: 모든 인용 기본 클래스 는 하위 클래스 의 대상 을 투명 하 게 사용 해 야 합 니 다.
//
// .cpp
// c++
//
// Created by on 16/5/12.
// Copyright © 2016 liulongling. All rights reserved.
//
#include <iostream>
using namespace std;
// :
class Bird
{
public:
bool fly() {
// ;
return true;
};
int getVelocity()
{
return this->velocity;
}
private:
int velocity;
};
//
class Ostrich: public Bird
{
bool fly() {
// ;
return false;
};
int getVelocity()
{
return 0;
}
};
int main()
{
// 。
Bird* bird = new Ostrich;
cout<<"h:"<<3000/bird->getVelocity()<<endl;
return 0;
}
C + + 표준 은 0 오 류 를 제외 한 것 을 표준 이상 으로 생각 하지 않 기 때문에 네 이 티 브 배열 이 경 계 를 넘 는 것 이 왜 이상 이 아 닌 지 와 마찬가지 로 '효율 / 성능' 을 위 한 것 이다.C + + 의 아버 지 는 C + + 언어 디자인 에 관 한 책 (The Design and Evolution of C + +) 에서 다음 과 같이 말 했다.
“low-level events, such as arithmetic overflows and divide by zero, are assumed to be handled by a dedicated lower-level mechanism rather than by exceptions. This enables C++ to match the behaviour of other languages when it comes to arithmetic. It also avoids the problems that occur on heavily pipelined architectures where events such as divide by zero are asynchronous.”
간단하게 번역: "밑바닥 의 사건, 예 를 들 어 계산 상의 넘 침 과 0 오 류 를 제외 하고 같은 밑바닥 의 메커니즘 으로 그것들 을 처리 하 는 것 으로 여 겨 진다. 이것 은 C + + 가 산술 분야 의 성능 과 관련 되 어 다른 언어 와 경쟁 할 수 있 게 한다. 또한, 0 오 류 를 제외 하고 비동기 적 인 상황 에서 도 일부 사건 을 피 할 수 있다.(번역자: 예 를 들 어 다른 스 레 드 에서 발생) 발생 할 수 있 는 '파이프 가 많다' 는 구조 문제 입 니 다. 그래서 저 는 자바 코드 로 이 사례 를 실현 하 는 것 으로 바 꾸 었 습 니 다.
package com.lll.test;
//
public class Bird {
private int velocity;
public int getVelocity() {
return velocity;
}
public void setVelocity(int velocity) {
this.velocity = velocity;
}
}
package com.lll.test;
//
public class Ostrich extends Bird{
public int getVelocity() {
return 0;
}
}
package com.lll.test;
public class main {
public static void main(String[] args) {
Bird bird = new Bird();
bird.setVelocity(100);
int h = flyTime(bird);
System.out.println(" :"+h);
}
public static int flyTime(Bird bird)
{
return 3000/bird.getVelocity();
}
}
운행 결과 정확: 비행 시간: 30
package com.lll.test;
public class main {
public static void main(String[] args) {
Bird bird = new Ostrich();
bird.setVelocity(100);
int h = flyTime(bird);
System.out.println(" :"+h);
}
public static int flyTime(Bird bird)
{
return 3000/bird.getVelocity();
}
}
실행 결과 이상: thread "main" java. lang. ArithmeticException: / by zero at com. ll. test. main. flyTime (main. java: 11) at com. ll. test. main. main (main. java: 7)
대상 을 대상 으로 하 는 언어의 세 가지 특징 은 계승, 포장, 다 형, 리 씨 교체 원칙 은 계승, 다 형 이라는 두 가지 특성 에 의존 한 다 는 것 을 잘 알 고 있다. 리 씨 교체 원칙 의 정 의 는 모든 기 류 를 인용 하 는 곳 에서 그 자 류 를 투명 하 게 사용 해 야 한 다 는 것 이다.오류 와 이상 이 발생 했 습 니 다. fly Time 방법 을 사용 할 때 사용자 fly Time 방법 에서 매개 변수 Bird 가 Ostrich 로 바 뀌 었 을 때 이상 이 발생 했 습 니 다. 그러면 리 씨 교체 원칙 에 현저히 위배 되 었 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.