2010-11-19 5 views
0

구현중인 Carrier 클래스의 클래스 계층 구조를 설계하는 방법을 알아 내려고하고 있습니다.Java에서 다중 상속없이 클래스 계층 구조 설계

현재 저는 기본 기본 클래스 Carrier를 보유하고 있습니다.

타이밍 및 도메인 관련 정보로 Carrier를 확장하는 다른 추상 클래스 TimedCarrier (TC)가 있습니다. Concrete 클래스는 Carrier와 TimedCarrier에서 확장됩니다.

사용자는 진행 모니터가 필요하므로 Carrier에서 확장 된 추상 클래스 MonitoredCarrier (MC)를 만듭니다. 구체적인 클래스는 모니터링 된 캐리어에서 확장됩니다.

사용자 요구 사항이 변경 될 때까지 잠시 동안 제대로 작동합니다. 이제 MonitoredTimedCarrier가 필요합니다. 분명히 TC와 MC 모두를 하위 클래스로 분류 할 수는 없습니다. 내가 인터페이스로 MC를 구현 생각 해요 :

class TimedCarrier implements IMonitored 
class Carrier implements IMonitored 

(즉,이 도메인의 맥락에서 나에게 더 의미가 있기 때문에, 나는 그들이 초과하고 있는지 여부 캐리어를 모니터링 할 수 있어야합니다)하지만, MC는 풍부한 구현 클래스이며, 모든 메소드를 MC에서 확장하는 데 사용되는 클래스에 복사하여 붙여 넣어야합니다. 나는 코드를 복제하고 싶지 않다.

어떻게하면이 문제를 해결할 수 있습니까? 감사.

[편집]

TimedCarrier 멤버 변수 게터/세터 방법 무리 캐리어를 연장한다. MonitoredCarrier는 멤버 변수, getter/setter 메서드 및 모니터와 함께 작동하는 여러 메서드를 사용하여 Carrier를 확장합니다.

class TimedCarrier extends Carrier { 
    int var1.. 
    int var2.. 

    public void setVar1(int var1) {...} 
    public int getVar1() {...} 
    .... 
} 

class MonitoredCarrier extends Carrier { 
    int var1.. 
    int var2.. 

    public void setVar1(int var1) {...} 
    public int getVar1() {...} 
    .... 
    public void monitorSomething() {...} 
    public void monitorOtherSomething() {...} 
} 

답변

3

위임을 사용하는 것이 좋습니다. 예를 들어, TimedCarrier으로 확장하는 대신 Carrier으로 확장 한 다음 위임 된 인스턴스로 TimedCarrier의 생성자로 전달할 수 있습니다. TimedCarrier은 작업을 위임하지만 타이밍을 추적합니다.

동등 물 MonitoredCarrier.

물론 무엇이 진행되고 있는지에 대한 세부 사항을 알지 못해도 이것이 적절한지 정확하게 말하기는 어렵지만 여러 번 성공적으로 사용한 방식입니다. (인터페이스가 아닌 추상 클래스가 되려면 Carrier이 필요합니까? 인터페이스를 가지고 일반 작업을위한 인터페이스를 구현하는 추상 클래스를 만드는 것이 합리적일까요?)

+0

나는 동의해야한다. 많은 경우 컴포지션이 상속보다 우선합니다. – gpampara

2

그런 다음이 항목을 선택하십시오.

class TimedCarrier implements Carrier, Timeable {....} 
class MonitoredCarrier implements Carrier, Monitorable {....} 
class MonitoredTimedCarrier implements Carrier, Timeable, Monitorable {....} 

그리 멀지 않은 생각입니다. 자바 API의 모든 곳. Runnable, Comparable 등을보세요.

0

나는 Carrier, Timer 및 Monitor를 인터페이스로 사용하여 클래스에서 필요한 것을 구현할 수 있습니다.

기능을 믹싱하는 경우 MonitoredTimedCarrier를 MonitoredCarrier로 확장하고 Timer를 구현 한 다음 모든 Timer 메서드를 필요한 기능으로 추상 클래스를 확장하는 내부 클래스로 프록시 처리 할 수 ​​있습니다.

이것은 하나의 잠재적 인 방법 일뿐 아니라 여기에 도움이되는 여러 디자인 패턴이 있습니다. 행운을 빕니다!