2012-03-23 1 views
0

일부 메소드에서는 서브 클래스가 항상 super()를 호출 할 것으로 예상됩니다. 컴파일 타임에 어떻게 강제 할 수 있습니까?Java/eclipse에서 super()를 호출하지 않도록 경고를 추가하는 방법

감사

+2

우리는 당신이 무슨 말을하고 있는지 전혀 모릅니다. 메소드는 구현 세부 사항에 전적으로 의존하여 필요한 경우'super() ... '를 호출합니다. 이에 대한 일반적인 대답은 없습니다. –

+1

나는 그것이 가능하다고 생각하지 않는다. 그러나, 나는 그것이 정말로 당신이 원하는 것이라고 생각하지 않습니다. 슈퍼 메서드 호출을 강제하면 다형성의 원칙을 위반하게됩니다. –

+0

나는 슈퍼를 부탁하는 것이 좋지 않다는 것을 안다. 그러나 나는 수퍼 클래스를 소유하지 않았다. 그리고 SDK 문서는 super를 호출해야합니다. 예를 들어, [link] (http://developer.android.com/reference/android/test/ServiceTestCase.html#setUp%28%29) –

답변

2

일반적인 경우는 Chris White 님의 답변이 좋다고 생각합니다. 그러나 "나는 super를 호출하도록 강요하는 것은 잘 안다.하지만 나는 수퍼 클래스를 소유하지 않았다. 그리고 SDK 문서는 예를 들어 link라는 super를 호출 할 필요가있다."는이 특별한 경우에는 적합하지 않다는 것을 암시한다.

따라서 Chris White의 답변을 수정하여이 세부 사항을 충족시킬 것을 제안합니다.

class ChenYingTestCase extends ServiceTestCase 
{ 
     /** 
     * Gets the current system context and stores it. 
     * You can not extend this method. 
     * If you want to achieve the effect of extending this method, 
     * you must override chenYingSetupMethod. 
     **/ 
     public final void setUp () 
     { 
      super.setUp () ; 
      chenYingSetup () ; 
     } 

     /** 
     * Does nothing (unless you extend it) 
     * 
     * Extend this method to do your 
     * own test initialization. If you do so, there is no need to call super.setUp() 
     * Hint: calling super.setUp() is probably a bad idea. 
     * as the first statement in your override. 
     * Just put your test initialization here. 
     * The real SetUp method will call super.setUp() and then this method. 
     **/ 
     protected void chenYingSetUp () 
     { 
     } 
} 

그런 다음 하위 클래스가 제어하에있는 경우이를 ChenYingTestCase의 하위 클래스로 만듭니다. 하위 클래스가 제어 할 수 없다면 super()를 호출하도록 강요 할 수 없습니다.

+1

즉, 문제를 캡슐화 된 수퍼 클래스의 첫 번째 즉각적인 하위 클래스로 옮긴 다음 하위 클래스를 강제 실행합니다 필요한 로직 만 구현할 수 있습니다. 좋은 계획. +1 –

8

당신은 행동을 적용 다르게이 조금 엔지니어 수 :

슈퍼 클래스는 추상적해야한다, 또는 적어도 방법 결승전을 정의합니다. 그런 다음 서브 클래스가 구현해야하고 마지막으로 슈퍼 클래스는 사전에 실행해야하는 어떤 코드 완료 한 후 메소드를 호출해야합니다 보호 방법 정의 : 물론

public abstract class SuperClass { 
    // final so it can't be overriden 
    public final void superMethod() { 
     // required code here 

     // then delegate to implMethod 
     implMethod(); 
    } 

    protected abstract() void implMethod(); 
} 

public class SubClasss extends SuperClass { 
    protected void implMethod() { 
     // sub class logic 
    } 
} 

을, 슈퍼 클래스 추상적 될 필요가 없습니다, implMethod를 구현 한 다음 하위 클래스가 그것을 오버라이드하도록 허용

+0

이것은 http://checkstyle.sourceforge.net/config_design.html#DesignForExtension의 훌륭한 예제입니다. – emory

0

기본 클래스에 매개 변수없는 기본 생성자가 있으면 명시 적 super() 호출이 제공되지 않으면 항상 자동으로 호출됩니다. 당신이 기본 클래스를 제어 할 경우 기본 생성자는 비공개로 할 수 있습니다이 없다면

public abstract class Whatever { 
    private Whatever() { 
     // not visible to subclasses 
    } 

    public Whatever(A a, B b, ...) { 
     // this constructor must always be explicitly called by subclasses 
    } 
} 

, 당신의 IDE는이에 대한 경고를 켤 수 있습니다. 그것은 옵션 메뉴 어딘가에있을 것입니다. 당신이 그것을 보지 않는다면, 거기 있지 않습니다.