2013-02-24 5 views
2

나는 다소 당황 스럽다. 클래스 animal을 가지고 있습니다. 위치 등의 기본 정보를 저장한다고 가정 해 봅시다. 그러면 animal을 확장하는 클래스 smartAnimal이 있습니다. smartAnimal이 사용자의 입력없이 의사 결정을 할 수있는 기능을 추가한다고 가정 해 보겠습니다.Java의 적절한 상속 아키텍처

는 지금, 나는 animal를 확장하는 클래스 dog 있습니다. 해당 기능이 필요 없기 때문에 smartAnimal을 확장하지 않습니다. doganimal이며 smartAnimalanimal입니다 : 지금까지 난 괜찮아. 하지만 지금은smartAnimal을 확장 할 것이지만 smartDogdog해야 smartDog것을 원한다. 예를 들어, 일반 dog의 많은 기능이 있는데, .sniff(), .poop().bark()도 내 smartDog에 있어야하지만 자바가 다중 상속을 허용하지 않기 때문에 글자를 그대로 복사 + 붙여 넣기하지 않는 한 그대로 사용하지 마십시오. 내가 가진 경우 때문에

구성은 우아 보인다

class smartDog{ smartAnimal thisSmartAnimal; dog thisDog; }

... 난, 예를 들어, 같은 animal의 위치를 ​​"물건"을 복제 할 것입니다. 두 세트의 위치 변수를 처리해야합니다. animal에있는 모든 속성의 중복. 의는 dog는 인터페이스, .sniff(), .poop()이었다 가정 해 봅시다 때문에, 중 적절한 솔루션을 같은 소리하지 않는 여러 인터페이스를 상속

.bark()의 구현 은 다양하고 smartDog하고 무엇을 위해 다시 구현 될 필요는 없습니다 다른 클래스.

여기에서 가장 좋은 방법은 무엇입니까? 즉, 두 클래스가 모두 dogsmartDog입니까?

는 편집 :

코멘트/답변의 일부에서

, 저를 명확히하자. 내 특정 프로젝트에서 smartAnimal 실제로 그것을 제어하는 ​​전체 신경망이 있습니다. 그것은 많은 코드이며 인터페이스로 추상화하는 것이 타당하지 않습니다. NN 기능의 핵심은 동물에 상관없이 동일하지만 각 smartAnimal 하위 클래스는 AI "두뇌"의 출력을 다르게 구현합니다. 반대로, 각 동물은 인간이 그것을 제어하든, 아니면 AI 자신의 AI 에이전트가 제어하든 상관없이 동일한 기능을 수행합니다.

+1

'smartDog'는'dog'을 연장해야합니다. –

+0

그러나 똑같은 상황에 처하게 될 것입니다 만, 그 반대의 경우도 smartDog에 'smartAnimal' 기능을 복사 + 붙여 넣기해야합니다 ... – honkbert

+1

오, 알아요. 지금은 자바 SE에서 어렵다. 예를 들어 스칼라 또는 IoC 패턴을 사용하는 동안 더 간단하다. –

답변

3

대답은 현실적인 계승 구조가 아니라는 점입니다. 서브 클래스에서 메소드를 추가하는 것을 설명하는 "일부 기능"을 제공합니다. 이것은 적절한 유산이 아닙니다.적절한 상속 (자바에서는 적어도) 모든 메소드는 상속 계층의 최상위 레벨에 있어야합니다. 상속은 코드 재사용을위한 것이지 트리에 깊숙이 들어가는 동안 기능을 추가하는 것이 아닙니다. 그러므로 주어진 질문에 대한 답은 실제로 없습니다.

+0

오브젝트를 사용하여 작업하는 방법과 인터페이스를 프로그래밍하는지 여부는 질문입니다. 모든 방법이 계층 구조 수준에만 존재해야하는 이유는 없습니다. –

+0

예,하지만 저는 상속에 관해서 "오렌지는 과일이지만 과일은 반드시 오렌지색이 아닙니다"라는 예를 여러 번 보았습니다.'orange'가'fruit'를 확장한다면,'orange'는'orange'에 대한 몇 가지 특정 정보/기능을 가지고 있기 때문에, 그것은 적절한 상속이 아닙니다. – honkbert

+0

Ryan이 맞습니다. 토론 주제와 관련하여 너무 많은 질문이 아니며 Q & A 포럼과 관련하여 너무 광범위하기 때문에이 질문을 닫는 것이 좋습니다. –

2

나는 당신이 찾고 될 수 있습니다 내가 그없이 현명한 해결책이 smartAnimal 상속 개를 가지고하는 것입니다 생각 "기본 구현"

라는 새로운 JDK 8 기능이 있다고 생각합니다. 마찬가지로 : smartDog는 Animal 인 smartAnimal 인 개입니다. 정말 당신의 객체가 구현하는 무엇 달려으로

이 더 정확한 조언을하기가 어렵습니다. 예를 들어 내부 상태를 가지고 있습니까? 아니면 새로운 행동 만 정의하고 있습니까?

+0

+1 ** 실제로 개체가 구현하는 것에 따라 달라집니다 ** –

+0

서브 클래 싱 된 개체는 고유 한 내부 상태를 갖습니다. – honkbert

2

여기에서 Java에 대해 이야기하고 있으므로 모델은 다중 인터페이스가있는 단일 상속입니다.

이러한 예제를 고려할 때 올바른 수준의 추상화가 적절하다고 말합니다. 이다 가, 대답은 조합에있다 :

  1. 적절한 상속 (과 행동의 "있다" "A는"에 GOF 책을 참조). "개가 똑똑하다"는 말을 발견하면 개가 "mamal"대 행동 (아마도 명사 대 형용사)을 보입니다. "똑똑한"개는 멍청한 개와는 다른 행동을 보여 주지만 둘 다 데이터 모델링 관점에서 "개"입니다.
  2. 적절한 집계. 여러 번 복잡한 "것들"을 구성 요소로 분해하는 것이 유용하다는 것을 알게되었습니다. 그래서 "자동차"는 엔진, 변속기, 섀시 등으로 구성됩니다. 개는 모피 (색상, 질감 등), 다리, 머리, 몸 모양 등을 가지고 있으며 그 때 차별화하는 것이 적절할 수 있습니다 개가 무엇인지, 그렇지 않은가를 구분합니다 (스마트 = 인터페이스).
  3. 추상 인터페이스. 이 예제에서 어려울 수있는 것은 "스마트"는 다양한 유형의 개체/명사간에 다를 수 있다는 것입니다. "똑똑한"개는 명령을 이해할 수 있지만 "스마트 한"전화는 이메일과 같은 특정 기능을 가지고 있습니다. 따라서 "스마트"는 최상위 레벨에서 적절한 인터페이스가 아니지만 "포유류"와 관련 될 수 있습니다. - "개"는 포유 동물이 Mammal.Smart 인터페이스 (포유류에만 해당)를 구현할 수 있습니다.

이것은 사실 정보 모델링 및 컴퓨터 과학 전체에서보다 어렵고 중요한 측면 중 하나입니다. 도서 및 연구의 전체 그룹은이 주제에 집중되어 있으므로 스택 오버플로 질문으로 적합하지 않을 수 있습니다. 즉, 간단하고 간단한 간단한 답변을 제공하는 것입니다.

관련 문제