Post List

2015년 1월 4일 일요일

public 상속 모형은 반드시 "is-a(...는 ...의 일종이다)" 를 따르도록 만들자.

* public 상속의 의미는 "is-a(...는 ...의 일종)" 입니다. 기본 클래스에 적용되는 모든 것들이 파생 클래스에 그대로 적용되어야 합니다. 왜냐하면 모든 파생 클래스 객체는 기본 클래스 객체의 일종이기 때문이다.

 모든 Derived 객체는 Base 객체의 일종이지만(D is a B), 모든 B는 D가 아니다.
 학생은 사람의 일종이지만, 모든 사람이 학생은 아니다.

 잘못 된 상속의 예

 1. Bird 클래스는 fly() 라는 함수를 가진다. Penguin은 Bird를 상속받는다. 하지만 Penguin은 날 수가 없다.

    => Bird 클래스를 상속받은 FryingBird 클래스를 만들고 Penguin은 Bird를 상속받아서 만든다. 하지만 지금 프로그램에서 FryingBird의 fly() 가 무의미하다면 그냥 원래대로 만드는 것이 더 나을 수도 있다.
    => Penguin의 fly()가 호출되면 Error를 발생시킨다.
    => Bird 클래스에서 fly()라는 함수를 제거한다.

 2. Rectangle (직사각형) 클래스를 상속받아서 Square (정사각형) 클래스를 만든 경우. Rectangle의 객체를 받아서 width(가로길이)만 늘이는 함수가 있을 경우, Square 객체를 넣어도 정상적으로 동작한다. 하지만 이럴 경우 Square의 속성이 깨어져버린다.

 Class 들 사이의 관계는 is-a 만 있는게 아니다. "has-a(...는 ...를 가짐)" 도 있고 "is-implemented-in-terms-of(...는 ...를 써서 구현됨)" 도 있다.

댓글 없음:

댓글 쓰기