2011-08-25 3 views
6

때로는 다음과 같이 몇 가지 클래스 디자인을 접하게되었습니다.구체적인 부모를 확장 시켜서 추상적 인 아이를 가지기위한 목적

abstract class animal { 
    public abstract void speak(); 
} 

class dog extends animal { 

    @Override 
    public void speak() { 
     // Do something. 
    } 

} 

abstract class abstract_dog extends dog { 
    @Override 
    public abstract void speak(); 
} 

궁금 해서요, abstract_dog 클래스를 갖는 목적은 무엇인가? 왜 우리는 비 추상적 인 말하기 방법을 추상적으로 바꾸는가?

+0

참고 : 클래스 계층 구조를 제어하는 ​​경우 더 나은 방법은 구체적 개 클래스를 완전히 제거하거나 하위 클래스로 abstract_dog를 사용하는 것입니다. 비 리프 클래스 추상화를 선호합니다. –

답변

4

사람들이 speak을 무시하도록하는 기본 클래스를 만들고 싶지만 Dog을 상속합니다.

+0

당신의 대답이 기술적으로 정확할 때, 내가 리뷰 할 때이 코드의 냄새라고 생각할 것입니다. (여전히 +1) – nfechner

+0

@nfechner : 그건 완전히 상황에 달려 있습니다. 나는 5 년 이상의 개발 기간 동안 이것을 정확하게 수행 할 필요가 있다고 생각합니다. – SLaks

+0

+1 당신의 대답은 (질문뿐만 아니라) 실제 상황이 결여되어 있지만 간단한 이유가 있습니다. –

0

내가 SLaks에 동의하고, 이것은 실제 상황이 될 것이라고 생각한다

abstract class animal { 
    public abstract void speak(); 
} 

class dog extends animal { 

    @Override 
    public void speak() { 
     // Dog says 'bark' 
    } 

} 

abstract class abstract_dog extends dog { 
    @Override 
    public abstract void speak(); 
} 

class poodle extends abstract_dog { 
    @Override 
    public void speak() { 
     // poodle says 'yip yip' 
    } 
} 

class great_dane extends abstract_dog { 
    @Override 
    public void speak() { 
     // great dane says 'ruff ruff' 
    } 
} 

난 당신이 새 자식 클래스는 speak 메소드를 구현하면 메이크업을 원하는 경우에 이것을 사용할 것이라고 생각하고 dog 클래스에는 새 자식 클래스가 구현할 필요가없는 다른 메서드가있을 수 있습니다.
정확한 상황에 대해 더 많이 알면이 시나리오를위한 더 좋은 디자인이 있는지 판단하는 데 도움이됩니다.

+0

그러나이 예에서는 abstract_dog를 건너 뛸 수 있습니다. – Buhb

+0

@Buhb, 그건 사실이고,이 디자인의 잠재적 인 문제입니다. – rosscj2533

관련 문제