전통적인 클래스 계층 구조의 잘 알려진 단점은 실제 세계를 모델링 할 때 나쁘다는 것입니다. 예를 들어, 클래스로 동물의 종을 표현하려고합니다. 실제로 그렇게 할 때 몇 가지 문제가 있지만 해결책을 찾지 못한 것은 하위 클래스가 펭귄이 날 수없는 것처럼 수퍼 클래스에 정의 된 동작이나 속성을 "손실"할 때입니다. 아마도 더 좋은 예 일지 모르지만 그것이 내 마음에 오는 첫 번째 예입니다).
한편으로는 모든 속성과 동작에 대해 존재 여부를 지정하는 플래그를 정의하고 해당 동작이나 속성에 액세스하기 전에 매번 확인하지 않으려 고합니다. 조류 수업에서 새가 간단하고 명확하게 날 수 있다고 말하고 싶습니다. 그러나 나중에 어디에서나 끔찍한 핵을 사용하지 않고 "예외"를 정의 할 수 있다면 좋을 것입니다. 이것은 종종 시스템이 한동안 생산적 일 때 발생합니다. 갑자기 원래 디자인에 맞지 않는 "예외"를 발견하고이를 수용하기 위해 코드의 많은 부분을 변경하고 싶지 않습니다.
"슈퍼 클래스"에 큰 변화를주지 않고이 문제를 깨끗하게 처리 할 수있는 언어 나 디자인 패턴이 있습니까? 솔루션이 특정 사례 만 처리하더라도 여러 솔루션이 함께 완전한 전략을 구성 할 수 있습니다.
더 많은 생각을 한 후, 나는 Liskov 대체 원칙에 대해 잊었다는 것을 알게되었습니다. 그렇기 때문에 할 수 없습니다. 모든 주요 "기능 그룹"에 대해 "특성 / 인터페이스"를 정의한다고 가정하면 새 특성, 특수한 다람쥐 및 물고기와 같은 플라잉 특성이 구현되는 것처럼 계층 구조의 여러 가지에서 특성을 자유롭게 구현할 수 있습니다.
그래서 제 질문은 "어떻게 특성을 구현 해제 할 수 있습니까?" 수퍼 클래스가 Java Serializable 인 경우 상태를 직렬화 할 수있는 방법이 없어도 (예 : "소켓"이 포함 된 경우에도) 수퍼 클래스 여야합니다.
이를 수행하는 한 가지 방법은 항상 시작부터 모든 특성을 쌍으로 정의하는 것입니다. Flying 및 NotFlying (체크되지 않은 경우 UnsupportedOperationException이 발생 함). Not-trait는 새로운 인터페이스를 정의하지 않으며 간단히 확인할 수 있습니다. 특히 처음부터 사용하는 경우 "저렴한"솔루션처럼 들립니다.
" it would be nice if one could define "exceptions" afterward, without having to use some horrible hacks everywhere"
행동을 해킹하는 팩토리 방법을 고려하십니까?
NotSupportedException
있습니다 Penguin.fly()
.
class Penguin < Bird; undef fly; end;
. 당신이 상관없이 해야하는 것은 또 다른 문제이다.
function save_yourself_from_crashing_airplane(Bird b) { f.fly() }
이다. (Peter Török가 말했듯이 LSP를 위반 함)