일부 메소드에서는 서브 클래스가 항상 super()를 호출 할 것으로 예상됩니다. 컴파일 타임에 어떻게 강제 할 수 있습니까?Java/eclipse에서 super()를 호출하지 않도록 경고를 추가하는 방법
감사
일부 메소드에서는 서브 클래스가 항상 super()를 호출 할 것으로 예상됩니다. 컴파일 타임에 어떻게 강제 할 수 있습니까?Java/eclipse에서 super()를 호출하지 않도록 경고를 추가하는 방법
감사
일반적인 경우는 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 –
당신은 행동을 적용 다르게이 조금 엔지니어 수 :
슈퍼 클래스는 추상적해야한다, 또는 적어도 방법 결승전을 정의합니다. 그런 다음 서브 클래스가 구현해야하고 마지막으로 슈퍼 클래스는 사전에 실행해야하는 어떤 코드 완료 한 후 메소드를 호출해야합니다 보호 방법 정의 : 물론
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를 구현 한 다음 하위 클래스가 그것을 오버라이드하도록 허용
이것은 http://checkstyle.sourceforge.net/config_design.html#DesignForExtension의 훌륭한 예제입니다. – emory
기본 클래스에 매개 변수없는 기본 생성자가 있으면 명시 적 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는이에 대한 경고를 켤 수 있습니다. 그것은 옵션 메뉴 어딘가에있을 것입니다. 당신이 그것을 보지 않는다면, 거기 있지 않습니다.
우리는 당신이 무슨 말을하고 있는지 전혀 모릅니다. 메소드는 구현 세부 사항에 전적으로 의존하여 필요한 경우'super() ... '를 호출합니다. 이에 대한 일반적인 대답은 없습니다. –
나는 그것이 가능하다고 생각하지 않는다. 그러나, 나는 그것이 정말로 당신이 원하는 것이라고 생각하지 않습니다. 슈퍼 메서드 호출을 강제하면 다형성의 원칙을 위반하게됩니다. –
나는 슈퍼를 부탁하는 것이 좋지 않다는 것을 안다. 그러나 나는 수퍼 클래스를 소유하지 않았다. 그리고 SDK 문서는 super를 호출해야합니다. 예를 들어, [link] (http://developer.android.com/reference/android/test/ServiceTestCase.html#setUp%28%29) –