2011-01-09 1 views
3

오버로드?자바 내가 추상 템플릿 방법이 방법

감사합니다.

+1

OO 관점에서 볼 때, 나는 왜 그런 구조가 필요한지 열심히 생각할 것입니다. Object 클래스의 인스턴스에는 많은 동작이 없으므로 매개 변수로 전달해야하는 이유는 무엇입니까? –

+0

Horst가 말한 것과 마찬가지입니다. 메소드 서명에서 "Object"유형으로 작업하도록 기본 클래스를 정의하려는 경우 실제로 특정 유형을 처리한다고 가정하면 안됩니다. 제네릭 대신 MyTemplate의 클래스 계층 구조를 정의하는 것이 좋습니다. – whaley

답변

0

해당하지 않습니다. MyImpl의 doSomething (Object obj)은 MyTemplate의 doSomething을 재정의하는 메서드입니다.

MyImpl에서 doSomething (Object obj)의 instanceof-operator를 사용하십시오. 그것은 어쨌든 더 나은 스타일입니다.

+1

일반적으로 instanceof의 사용은 Liskov Substitution Principle (LSP)의 가능한 위반을 암시한다고 생각합니다. –

+0

이 경우 하위 클래스는 특수 유형의 객체에 대해 "최적화 된"것처럼 보이지만 모두 처리 할 수 ​​있습니다. 우리는 약간의 구별이 필요하며 이것은 instanceof에 의해 수행됩니다. 또한 뭔가를 서브 클래 싱하고 원본 객체 대신 IMHO를 사용하면 프로그램을 변경하는 좋은 방법이기 때문에이 원리가 마음에 들지 않습니다. 어쩌면 나는 그 원리를 이해하지 못했을 것입니다. – Daniel

+0

이러한 유형의 사안에서는 다형성이 instanceof보다 선호됩니다.또한 메소드 내의 특정 부속 유형을 점검하고있는 경우, 메소드는 해당 부속 유형을 매개 변수로 허용하고 수퍼 유형은 승인하지 않아야합니다 (OP가 제공하는 예제에서 일반 사항으로 수행 할 수 있음). – whaley

0

즉, 당신은 할 수 없습니다. 다른 해답이 이유를 설명했습니다. 대신 제네릭을 사용하고 String (또는 다른 특정 클래스)을 처리하기 위해 추상 클래스의 특정 하위 유형에 의존 할 수 있습니다. 예를 들어 :

abstract public class MyTemplate<T> { 
    abstract public void doSomething(T t); 
} 

public class MyTemplateImpl extends MyTemplate<Object> { 

    @Override 
    public void doSomething(Object o) { 
     System.out.println("Dealing with a generic Object"); 
    } 
} 

public class MyTemplateImplForStrings extends MyTemplate<String> { 
    @Override 
    public void doSomething(String s) { 
     System.out.println("dealing with a String"); 
    } 
} 

는 호출 코드는 다음과 같을 것이다 의미합니다 :

MyTemplateImplForStrings template = new MyTemplateImplForStrings(); 
template.doSomething("hello"); //prints ""dealing with a String" 

또는

MyTemplate<String> template = new MyTemplateImplForStrings(); 
template.doSomething("hello"); //prints ""dealing with a String" 

참고 : 당신은 당신의 참조로 추상 기본을 사용하지 않도록 할 것 String으로도 매개 변수화하지 않는 한 그렇지 않으면 런타임시 ClassCastExceptions 문을 열어두고 컴파일러에서 경고해야합니다.

0

Java 컴파일러는 메서드 인수의 컴파일 타임 형식을 사용하여 메서드 호출을 만듭니다.이 예제에서는 Object가 아닌 String입니다. 인수의 런타임 유형은 메소드 호출에 의해 무시됩니다.

입력 클래스를 모두 제어하거나 reflection을 사용하면 느려지거나 복잡해지며 잘못 입력하기 쉽습니다.

관련 문제