2011-09-26 5 views
1

해당 메소드가 상속 (하위 클래스 및 메소드 재정의)을 사용하는 경우에만 재정의하여 사용자 정의하고자하는 클래스가있는 경우 어떻게해야합니까? 같은 목표를 달성하기 위해 어떤 방식으로 작곡을 사용할 수 있습니까?재정의시 합성 상속 사용

답변

4

예, 위임을 사용할 수 있습니다. 아래 예제에서 Foo에서 파생되는 대신 Bar에는 Foo이 포함되며 선택한 위치에 위임됩니다.

interface SomeMethods { 
    void doSomething(); 
    void doSomethingElse(); 
} 

class Foo implements SomeMethod { 
    public void doSomething() { // implementation } 
    public void doSomethingElse() { // implementation } 
} 

class Bar implements SomeMethod { 
    private final Foo foo = new Foo(); 

    public void doSomething() { foo.doSomething(); } 
    public void doSomethingElse() { // do something else! } 
} 
+0

좋아, 그래서 슈퍼 클래스는 자식 클래스와 동일한 인터페이스를 구현해야합니다? –

+0

맞습니다. –

3

상속 대신 컴포지션을 사용하는 것이 디자인 선택입니다.

클래스가 상속을 염두에두고 설계되었거나 (즉, 최종적으로 공개되지 않고 보호 된 메소드를 제공하거나 서브 클래스로 대체되도록 의도 된) 클래스가 작성 또는 위임을 염두에두고 (전략 패턴).

클래스가 사용자 정의를 위해 설계되지 않은 경우 상속을 사용하여 사용자 정의 할 수 있지만 작성/위임 메커니즘은 사용하지 않을 수 있습니다.

3

확실히. 다음과 같은 패턴을 사용할 수 있습니다. 방법 방법의

간단한 최우선

템플릿 메소드 패턴

class Base { 
    public void foo() { 
     // do something 
     bar(); 
     // do something 
    } 
    protected abstract void bar(); 
} 

class Child { 
    protected void bar() { 
     // do something. 
    } 
} 

위임

class Base { 
    private Runnable r; 
    protected Base(Runnable r) { 
     this.r = r; 
    } 

    public void foo() { 
     r.run(); 
    } 
} 

class Child extends Base { 
    Child() { 
     super(new Runnable() { /* implementation */}) 
    } 
}