2012-04-12 2 views
2

나는 "폼"클래스를 많이 가지고 있는데,이 클래스들은 모두 Form입니다. 이 클래스를 확장하는 FormService이라는 추상 클래스와 특정 폼 서비스가 있습니다. 내가 원하는 것은 populate()이라는 추상적 인 메소드를 가지며, 따라서 상속을 통해 주어진 유형에 대한 올바른 서비스를 호출하는 형태의 형식을 취합니다.추상 메서드를 사용한 Java 상속

그래서 내가 좋아하는 뭔가를 : TestFormForm를 확장하는 유형 인

public abstract FormService { 
    public abstract void populate(Form form); 
} 

public TestFormService extends FormService { 
    public void populate(TestForm form) { 
     //populate 
    } 

. 내가 원하는 영향을 줄 수 없기 때문에 가능한가요?

답변

9

당신은 사용할 수 제네릭 :

public abstract FormService<F extends Form> { 
    public abstract void populate(F form); 
} 

public TestFormService extends FormService<TestForm> { 
    @Override 
    public void populate(TestForm form) { 
     //populate 
    } 
} 

@Override의 사용은 여기에 단지 좋습니다 것을 참고하지만, 질문과 관련이없는.

+0

'@ Override'에 대한 +1 언급은 –

+0

Paul에 감사드립니다. +1 –

-1

예 가능합니다. 자식 클래스의 메서드를 재정의하는 동안 부모 클래스 메서드에서 인수로 선언 된 수퍼 클래스의 하위 클래스를 항상 사용할 수 있습니다. 이 예제에서 testForm은 Form 클래스의 하위 클래스이므로이 메서드가 작동합니다. Thumb 규칙은 재정의하는 동안 우리는 항상 계층을 제한 할 수 있지만 계층을 확장 할 수는 없습니다.

Form 클래스의 상위 클래스가 Document라고 가정합니다. TestFormService 클래스 populate 메서드에서 Document를 인수로 사용할 수 없습니다. 이는 우선 적용되는 규칙을 위반하게됩니다.

+1

오버로드에 대해 설명하지 않아야합니다. 그러면 OP는 오버라이드에 대해 묻습니다. 그래서, 당신이 의미하는 것의 예를 게시하십시오, 그래서 당신이 의미하는 것이 명확합니다. – Tom

+0

코드 예제를 추가하려고 시도했습니다. 그러나 어떤 종류의 서식 오류가 있습니다. – user3395036

+0

http://stackoverflow.com/help/formatting – Tom