디자인 모델 6 대 원칙: 리 씨 교체 원칙 (5)

전송 표시:http://blog.csdn.net/liulongling/article/details/51383159 대상 을 대상 으로 하 는 다른 6 대 원칙 단일 직책 원칙 - 환상 서 유 를 데 리 고 간다 (1) 후진 원칙 (2) 개폐 원칙 (3) 디 미트 원칙 - 환상 서 유 (4) 인터페이스 격 리 원칙 (6)
리 씨 교체 원칙 은 매사 추 세 츠 공과 대학 (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 로 바 뀌 었 을 때 이상 이 발생 했 습 니 다. 그러면 리 씨 교체 원칙 에 현저히 위배 되 었 습 니 다.

좋은 웹페이지 즐겨찾기