2009-08-14 3 views
4

하위 클래스가 컴파일시에 기본 클래스에 정의 된 메서드가 아닌 public 메서드를 노출하지 못하도록하는 방법이 있습니까? 예를 들어Java : 하위 클래스가 기본 클래스와 다른 인터페이스를 제공하지 못하도록

:

아마도 내가 서브 클래스를 선언 할 AClass에서 사용할 수있는 몇 가지 키워드 만 방법이 AClass 거기 정의하여 구현 할 수있다
abstract public class AClass { 

    abstract public void anAllowedMethod(); 

} 

public class BClass extends Aclass { 

    public void anAllowedMethod() { 

    } 

    public void anAdditionalNonAllowedMethod() { 

    } 

    private void thisMethodIsAllowedBecauseItsNotPublic() { 

    } 

} 

(즉, "anAllowedMethod()".)?

+0

왜 이렇게하고 싶은지 궁금합니다. – MatrixFrog

+0

이러한 서브 클래스가 올바르게 사용되고 있는지 확인하십시오. 내가하고있는 프로젝트에서, 일부 개발자들은 필요하지 않은 추가 메소드를 서브 클래스에 추가하고 있습니다 (기존 인터페이스를 통해 구현할 수 있음). 그리고 파생 된 것을 모르는 경우 객체를 올바르게 사용할 수 없도록 만듭니다. 유형. "클라이언트"가 기본 클래스의 인터페이스 만 알아야한다는 것을 알면 단순화됩니다. – Joel

+2

당신이 할 수있는 한 가지는 API를 사용하는 사람들이 BClass 유형의 변수를 선언하지 않도록 권장하는 것입니다. 'List myList = new ArrayList ()'이'ArrayList myList = new ArrayList ()'보다 나은 것으로 생각됩니다. 그래서 당신은 B 클래스를 인스턴스화하지만 변수 타입은 AClass이므로'anAdditionalNonAllowedMethod() '를 사용하지 않게 될 것입니다. – MatrixFrog

답변

1

게임의이 단계에서는 너무 늦을 수 있지만 실제로 구현 된 다른 유형의 생성자에서 대리인을 사용하는 관련 메소드로 최종 클래스를 만드는 것이고 메소드 최종 클래스의 대리인에게 전화하십시오. 그렇게하면 델리게이트에 추가하는 것은 무엇이든 호출 할 수 없습니다.

3

아니요. 클래스를 정의하고 그것이 다른 클래스를 확장/구현한다고 말할 때 그것은 확장/구현하는 클래스의 계약을 준수해야합니다. 상기 클래스의 행동을 더 포함시키는 것에 대한 제한은 없다. 프로젝트에서

내가 어떤 개발자가

내가 볼 필요하지 않은 서브 클래스에 추가 방법을 추가하고, 일하고 있어요,이 효과적으로 디자인이 조각에가는 것을 의미한다 개발자가 (객체에 새로운 공개 동작을 추가하여) 원하는 것을 수행하기 때문입니다.

불행히도 디자인을 구현 단계 (코딩)에 포함시키지 않으면 나쁜 일이 발생합니다. 특정 인터페이스를 차단하려는 경우 당신이 마지막 방법을 선언 할 수, 검토의 과정 (자동/수동) 일반적인 경우에

0

하지 ...

하지만 ...

을 고려하시기 바랍니다 추상 기본 클래스에서 인터페이스의 메서드 이름을 사용합니다. 그렇다고해서 하위 클래스가 인터페이스를 구현하지 못하게 막지는 못하지만 메서드 호출로 아무 것도하지 못하게됩니다.

나는 당신이 일을 허용하지 런타임에 반사를 사용할 수 있다고 가정 ...

그리고 당신은 절대적으로 AOP 컨테이너와 함께이 작업을 수행 할 수 있습니다. 방금 OP에 대한 추가 의견을 보았고 지금 당신이 가고있는 것을 봅니다. 내 권장 사항은 소스 제어 레벨에서 관리해야하는 것으로 이것을 처리하는 것입니다. 문제에 대한 런타임 검사를 수행하는 테스트 모드 (예 : 구현 단위 테스트로 처리) 또는 CI 시스템을 사용하는 경우) 체크인 할 때 이런 종류의 테스트를 거쳐야합니다.

0

최종으로 생각하십니까?

내가 아는 바는 당신이 요구 한 것이 아니지만 언어에서 이와 같은 기능이 없습니다. 또는, 그 문제에 관해, 내가 알고있는 어떤 언어로 - 그리고 나는 많이 안다.

우리는 당신이 원하는 것을 할 수있는 또 다른 방법을 찾고자합니다 - 근본적인 필요를 충족시키기 위해서.

그러나 나는이 일을하는 합리적인 이유를 상상할 수 없기 때문에 나는 혼란 스럽다.

왜 하위 클래스가 메소드를 추가하지 못하도록 하시겠습니까? 네가 두려워하는 것은 무엇일까요?

+0

나는 stil이 하위 클래스가 자신의 anOllowedMethod를 정의하기를 원하므로 최종 사용을 원하지 않는다고 생각합니다. –

0

나는 당신이하려고하는 것이 바람직하지 않다는 것을 다른 사람들이 동의합니다.그러나, 리플렉션을 사용하여 선언 된 메소드가 예상 한 것임을 확인할 수 있다고 생각합니다.

Method[] methods = this.getClass().getMethods(); 
for (Method method : methods) 
{ 
    if (method.getName() ...) // check to make sure method is expected 
    { 
     .... // if method not expected throw an exception 
    } 
} 
+0

나는 이것을하기를 제안하지 않을 것이다 ... 누군가가 그것을 구현하기에 충분히 어리 석을지도 ​​모른다는 두려움 때문에! –

+0

네가 맞을지도 모르지만 그가 묻는대로 할 것이다. :-) –

2

당신은이 (물론, 추상적 될 수 없음) 서브 클래스 될 수 있도록 클래스 마지막을 만들지 만, 콤포지션/위임을 사용하도록 설계, 그래서 대신 서브 클래스를 통해 구현을 다양한, 당신은 다를 수 클래스의 인스턴스 구성에서 사용하는 전략 객체에 따라 다릅니다.

1

Java는 이것을 지원하지 않습니다. 그러나 클래스의 클라이언트가 정의한 인터페이스 만 사용하도록하려면 Java 인터페이스를 선언 한 다음 팩토리를 사용하여 해당 인터페이스를 구현하는 객체를 만들 수 있습니다. 따라서 클라이언트는 인터페이스에서 메소드 만 호출 할 수있었습니다. 물론 누군가가 결정되면 (예를 들어 명시 적 캐스트를하는 것처럼)이 방법을 찾을 수는 있지만 사람들이 의도적으로 디자인을 위반하면 더 큰 문제가 있습니다.

+0

개인적으로 이것이 (대부분) 정답이라고 생각합니다. Java를 사용하면 어쨌든 인터페이스로 코딩해야합니다. 그러나 모든 팩토리를 작성하는 것보다 최신 유행/추세는 의존성 삽입 (Spring, EJB3, Guice 등)을 사용하여 구현 클래스를 작성하는 것입니다. 솔직히 DI는 매우 쉽고 사용하기 쉽습니다. – hohonuuli

+0

동의합니다. 일단 당신이 많은 공장을 가지고 있다면, DI 프레임 워크를 사용하는 것이 어쨌든 논리적 인 다음 단계입니다. –

관련 문제