2012-10-03 5 views
2

제 3 자 오픈 소스 최종 클래스의 비 최종 메소드를 재정의 싶습니다.Java 확장 최종 클래스

final class A 
{ 
    void put(obj a) 
    {...} 

    obj get() 
    {...} 
} 

는 어떻게 get()put() 메소드를 오버라이드 (override) 말해, 그러나 아직도이 클래스의 다른 행동과 기능을 유지하십시오.

+0

'A'가 실제로 사용되는 인터페이스를 구현하고 있는지 확인하십시오. 이 경우 당신은 행운이다 : 회원으로'A'를 포함하는'A1'을 생성하고 모든 인터페이스 메소드를 재 구현할 수있다. –

답변

13

그것은 오픈 소스입니다. 포크로 작성하고 클래스를 final이 아니게 만드십시오.

최종본이 아니라면 연장 할 수 없습니다.

+0

고마워, 존. '포크'는 무슨 뜻입니까? 코드를 복사하여 붙여 넣은 다음 "final"을 제거한 다음 get 및 put 메서드를 다시 작성하십시오. –

+1

@Kevin : "자신 만의 버전 만들기"와 같은 포크. 당신이 공개하든 안하든 상관없이 당신 자신의 전화입니다. 클래스를 비 최종적으로 만들거나 확장하거나 잠재적으로'get' /'put'의 동작을 변경시킬 수 있습니다. 물론 단점은 라이브러리의 새 버전을 구할 때마다 다시 변경해야한다는 것입니다 ... –

+0

은 래퍼 방식보다 우수한이 옵션입니까? 그렇다면 이유를 말해주십시오. 나는 건축 학적으로 흥미 롭다. –

1

final 클래스를 확장 할 수 없습니다. Java 스펙에 따라.

+0

@Phlip : 무언가를 무효화해야한다면 디자인 계층에서 클래스가 아닌 인터페이스를 사용하십시오. –

4

클래스에 put 및 get 메소드가 정의 된 정의 된 인터페이스가있는 경우 클래스를 프록시하려고 할 수 있습니다.

public interface CommonInterface { 

void put(); Object get(); 

} 

final class A implements CommonInterface 
{ 

void put(obj a) 
{...} 
obj get() 
{...} 

} 

public class ProxyToA implements CommonInterface{ 

    private A a; 

    void put(Object a){ 
    // your override functionality 

    } 

    Object get(){ 
     // same here 
    } 

    void otherAStuff(){ 
     a.otherAStuff(); 
    } 

} 

그리고 단지 CommonInterface을 사용하고 프록시 개체 :

가장 쉬운 방법은 이런 식으로 뭔가를 만드는 것입니다. 또는 JDK 프록시, javassist 등을 사용할 수 있습니다.

0

은 왜 클래스가 최종인지 확인해야합니다. 자신을 설득 할 수 있다면 그렇게 할 수 있습니다. 또 다른 옵션은 AspectJ을 사용하여 두 가지 방법의 동작을 변경하는 것입니다.

AspectJ을 사용하면 특정 메소드의 동작을 수정할 수 있습니다. 이는 보안 제한이 허용하는 메소드에 대해서도 수행 할 수 있으며 클래스의 개인 필드에 액세스하여 할당합니다.

0

짧은 대답은 클래스를 확장 할 수 없기 때문에 메서드를 재정의 할 수 없다는 것입니다. 오버라이드를 통해 get 및 put 메서드로 무엇을 할 계획입니까? 해당 메소드에 기능을 추가하려는 경우이 클래스를 감싸는 다른 클래스를 작성할 수 있습니다.