Lion
은 Meat
을 먹을 수 있지만 시금치 같은 음식을 먹을 수도 있습니다.
Lion
이 Food
의 어떤 종류도 먹을 수 없다면, Animal
의 구현으로 간주 될 수 없습니다.
하위 클래스 및 클래스 상속을 프로그램을 구성하는 수단으로 사용할 때이를 이해하는 것이 중요합니다. 하위 클래스를 인터페이스 또는 수퍼 클래스보다 더 구체적으로 만들지는 않습니다.
문제를 생성하는 대신 문제를 해결하는 방식으로 하위 클래스를 사용하려면이 가이드 라인을 준수해야합니다. All subclasses must be functionally equivalent to the super-class (Liskov Substitution Principle)
즉, 세 가지 다른 데이터베이스에 대한 데이터베이스 액세스를 제공하는 세 가지 클래스가 "기능"이 "데이터베이스 액세스 제공"이기 때문에 공통 클래스의 하위 클래스를 공유 할 수도 있습니다 (또는 공통 인터페이스를 공유 할 수도 있음). 당신의 Lion
예는 부족하다
는 실제 라이온스는 Food
의 어떤 종류를 먹지 않기 때문에 Animal
현실 세계의 정의에 따라, 라이온스는 Animal
의이 아니라는 것이다. 실제 세계의 라이온스는 알려지지 않은 동물의 일반적인 정의보다 식량 섭취가 더 구체적입니다. 그리고이 실제적인 라이온스를 이라는 하위 클래스로 모델링하는이 기능상의 차이점은이 특정 동물 정의이 적합하지 않음을 나타냅니다.
당신은 쉽게 Animal
"음식을 먹는"방법은 뭔가가 "먹는다 또는 음식을 거부합니다" "음식을 먹는"뭔가에서 Animal
의 정의를 변경하는 IncompatibleFoodException
을 던져함으로써이 문제를 해결할 수 있습니다.
왜 당신이 여기에서 오류가 발생합니다 생각하십니까? 사자의 피드 방법은 동물의 피드 방법보다 우선하지 않으므로 동물의 피드 방법이 foo를 호출합니다. 반환 유형으로 서브 클래스를 사용하려고하지만 팔머 목록에없는 경우 재정의가 발생합니다. – maks
실제로 오류가 발생하지 않습니다. 사자가 음식을 먹겠지 만'동물의 '방법이 부름 받겠지. 라이온의 구체적인 방법은 아니지만 일치하지 않아. –