2013-01-17 14 views
0

A이라는 추상 클래스와 BC이라는 상속 된 클래스가 있습니다. 나는 매개 변수를하는 방법이 있습니다java 상속 : 상속 된 클래스의 유형을 구분합니다.

myMethod (final A a) 

을하고 더 낫다고는 통해 인스턴스 객체의 타입의 경우에 다른 일을 좋아합니다. 내가 어떻게 해?

좋은 대안은 다른 디자인 패턴을 따르고 있지만 지금은 코드를 변경할 수 없습니다.

감사합니다.

+0

myMethod가 A 클래스의 일부입니까? –

+0

아니요, 그렇지만해야하며 매개 변수가 없어야합니다. –

+0

알았어. 이것은 정확히 instanceof를 피하기 위해 제안하고 싶습니다. 각 서브 클래스는 myMethod를 오버라이드 (override) 해, 그 기능을 구현하는 방법으로 구현합니다. 그러나 만약 당신이 그 특정 디자인에 묶여 있다면, 당신이 받아 들인 해결책이 아마도 최고 일 것입니다. –

답변

5

instanceof 키워드를 사용하십시오. 예를 들어 다른 사람의 제안으로

if (a instanceof B) {...} 
else if (a instanceof C) {...} 
else {...} 
+0

이것은 가난한 관행이든하지 않겠습니까? – ecbrodie

+0

C가 B의 하위 클래스이기도하다면 C에 대해 'if'테스트를 먼저 수행해야합니다. 비록 이것이 당신의 정확한 경우에 중요 할 지 모르겠다. –

+0

이것은 프로그램의 의미에 기반을두고 있습니다 ... 당신은 그 반대로 말할 수 있습니다. B는 C의 하위 클래스입니다. – ecbrodie

2

사용 instanceof 운영자 :

myMethod (final A a) { 
    if(a instanceof B) { 
    //... 
    } else if(a instanceof C) { 
    //... 
    } else { 
    throw new IllegalArgumentException("Unknown type: " + a); 
    } 
} 

그러나 모든 OO 원칙에 대한 것은 좋은 방법이 있다는 점에 유의하십시오.

0

당신 instanceof 연산자를 사용할 수 있습니다, 이것은 단지 당신이 작업하는 작은 프로젝트의 경우 그것은 아마 괜찮아요.

당신이 리팩토링 할 수없는 진술 감안할 때 (?)이 유형을 반환하는 추상 메소드를 추가하는 것입니다 또 다른 끔찍한 옵션을 선택합니다.

, 즉 (A)에 다음을 추가

public abstract Type getType(); 

public enum Type 
{ 
    B, C; 
} 

를 다음에 B를 구현 C.

예컨대 B 지역 :

예 :

@Override 
public Type getType() 
{ 
    return B; 
} 

을 마지막으로, 당신은 소요 당신의 방법이 사용할 수 있습니다

public void myMethod(final A a) 
{ 
    if (a.getType() == Type.B) 
     doSomething(); 
    else 
     doSomethingElse(); 
} 

참고 : 위는 내가 개인적으로 사용하지 것이라고 나쁜 솔루션을하지만, 나는 그것이로 instanceof를 사용하는 것보다약간 더 있다고 생각 : 당신이 관심을 지불 할 필요가

  • 수표의 순서를 사용할 때 instanceof
  • 다른 하위 클래스를 추가하면 마술처럼 기억할 필요가 없습니다. instanceof 숨김 어딘가 (쉽게) 유사 B에 D를 치료하거나 C

그것은 그렇게하지만 여전히 끔찍 (이 튀어 얼굴에서 당신을 난다)이 서브 클래스 D를 추가하는 경우

  • 는이 솔루션을 사용하면 다음을 할 수 있습니다 당신이 할 수있는 경우 이것을 피하기 위해 짧은, 리팩터링.

  • +0

    -1 슈퍼 클래스는 자신의 서브 클래스에 관해서는 안된다. 귀하의 예에서 새 서브 클래스가 올 때마다 Type에 다른 값을 추가하여 수퍼 클래스를 편집해야합니다. – splungebob

    +0

    나는 개인적으로 이것과 함께 가지 않을 것이다. 나는 내 솔루션과 전염병과 같은 instanceof 솔루션을 피하기 위해 리팩토링을 할 것이다. OP가 그가 리팩토링 할 수 없다고 말하면, 나는 개인적으로 이것을 instanceof보다 선호한다. 다른 하위 클래스를 추가하면 내 솔루션은 유형에 대해 신경 쓰는 나쁜 코드가 있다는 사실을 즉시 경고합니다. 즉, 다른 하위 클래스를 추가 할 때 instanceof를 사용하는 코드 블록을 업데이트하는 것을 너무 쉽게 잊어 버릴 수 있습니다. – phippsnatch