2013-08-21 2 views
0

인사말 및 인사말!추상 클래스 확장 - 추상 메소드 구현

저는 현재 추상 클래스 A와 그것을 서브 클래 싱하는 많은 클래스를 가지고 있습니다. oneMethod()에 넣은 모든 하위 클래스에 공통적 인 코드와 각 구현에 고유 한 코드를 두 가지 추상 메서드에 넣었습니다.

public abstract class AbstractA { 
    public oneMethod() { 
      //do some intelligent stuff here 
      abstractMethodOne(); 
      abstractMethodTwo(); 
    } 
    protected abstract void abstractMethodOne(); 
    protected abstract void abstractMethodTwo(); 
} 

oneMethod() 메서드를 재정의하는 클래스가 있습니다.

public class B extends AbstractA { 
    @Override 
    public oneMethod() { 
      //do some other intelligent stuff here 
    } 
} 

서브 클래스에서 두 개의 추상 메소드의 스텁 구현을 건너 뛸 수있는 방법이있다? 나는 그들이 사용 된 유일한 장소가 재정의 된 방법에 있다는 것을 의미한다.

도움을 주시면 감사하겠습니다.

답변

2

모든 추상 메소드에 구현을 제공해야합니다. 프로그램의 어느 부분도 지금 호출하지 않더라도 나중에 호출 할 클래스를 만들거나 수퍼 클래스 구현을 변경할 수 있습니다. 스터브는 바이너리 호환성 만있는 경우에도 필요합니다.

5

아니요. 추상 클래스를 확장하는 경우 하위 클래스를 추상 클래스로 만들거나 상위 클래스 계약을 충족시켜야합니다.

디자인 관찰에서 oneMethod()를 최종 또는 추상화하려고하는 것이 좋습니다. 확장을 허용하는 프로그램을 유지하는 것은 어렵습니다. 다른 추상 메소드를 사용하여 자식 클래스가 oneMethod()의 기능에 연결되도록합니다.

0

음, 경우 abstractMethodTwoabstractMethodOne 왜 당신이 기본 추상 클래스에서 이러한 방법을 넣어, 구현 고유의입니까? 어쩌면 일반적인 인터페이스 또는 일부 특정 디자인 패턴이 당신이 찾고있는 것일 수 있습니다!

+0

oneMethod가이를 호출해야하기 때문에. –

0

클래스 B와 A가 자신의 oneMethod를 구현해야한다면 상속 링크에 없기 때문에 동일한 인터페이스를 구현해야 할 수도 있습니다.

2

당신은 슈퍼 클래스에 oneMethod를 당겨 수 :

public abstract class AbstractC { 
    public void oneMethod() { 
    } 
} 

public abstract class AbstractA extends AbstractC { 
    @Override 
    public void oneMethod() { 
    //do some intelligent stuff here 
    abstractMethodOne(); 
    abstractMethodTwo(); 
    } 

    protected abstract void abstractMethodOne(); 

    protected abstract void abstractMethodTwo(); 

} 

public class B extends AbstractC { 
    @Override 
    public void oneMethod() { 
    //do some other intelligent stuff here 
    } 
} 

는 당신이 필요로하는 것보다 당신이 AbstractC에 더 이상 필요하지 않습니다 어떻게 지금 참조하십시오.

+0

Ick. 여러 수준의 추상 클래스? 나는 그 길을 가지 않을 것이다. –

+1

@EricStein - 추상화가 불쾌감을주는 경우 인터페이스가 될 수 있습니다. – OldCurmudgeon

1

그냥 클래스 B도 추상화하십시오.

public abstract class B extends AbstractA { 
+0

그건 컴파일 문제를 해결할 것이지만 나중에 클래스를 인스턴스화해야하므로 어쨌든 스텁이 필요할 것입니다. –

+1

이것은 AbstractA 추상화를하지 않고 빈 메소드 본문을 갖는 것과 동일합니다. 양자 택일로 당신은 마지막에 다음을 할 수 있습니다 :'new B() {@Override public void abstractMethodOne() {...} ...}'. –

+0

실제로 스텁의 양은 oneMethod를 오버라이드하는 서브 클래스가 아닌 2로 줄임으로써 실제로 더 잘 작동합니다 * 2. –

1
abstractMethodOne() 이후

abstractMethodTwo()는 구현 고유하지만 당신은 당신이 항상 같은 구성을 사용할 수 있습니다 그들에게 전화 것이라는 점을 알고있다 :

public interface SomeInterface { 
    void abstractMethodOne(); 
    void abstractMethodTwo(); 
} 

와 같은 클래스 생성 :

public class SomeClass { 
    public void executeThem(SomeInterface onSomeObject) { 
     onSomeObject.abstractMethodOne(); 
     onSomeObject.abstractMethodTwo(); 
    } 
} 

다음과 같은 메소드를 호출해야하는 클래스에서이 값을 작성할 수 있습니다.

public class SomeImplementation implements SomeInterface { 

    public void abstractMethodOne() { 
     // ... 
    } 
    public void abstractMethodTwo() { 
     // ... 
    } 

    public void executeThem() { 
     new SomeClass().executeThem(this); 
    } 
} 

이 방법을 사용하면 상속을 완전히 제거하고 SomeInterface을 구현하는 클래스에서보다 유연하게 처리 할 수 ​​있습니다.

+0

이것은 실제로 매우 똑똑하지만 하위 클래스에서 액세스해야하는 해당 수퍼 클래스의 매개 변수가 아직 남아 있습니다. 내가보기 엔 상속이 필요하다. –

+0

슈퍼 클래스에 액세스해야하는 필드가 있음을 의미합니까? –