A
이라는 추상 클래스와 B
및 C
이라는 상속 된 클래스가 있습니다. 나는 매개 변수를하는 방법이 있습니다java 상속 : 상속 된 클래스의 유형을 구분합니다.
myMethod (final A a)
을하고 더 낫다고는 통해 인스턴스 객체의 타입의 경우에 다른 일을 좋아합니다. 내가 어떻게 해?
좋은 대안은 다른 디자인 패턴을 따르고 있지만 지금은 코드를 변경할 수 없습니다.
감사합니다.
A
이라는 추상 클래스와 B
및 C
이라는 상속 된 클래스가 있습니다. 나는 매개 변수를하는 방법이 있습니다java 상속 : 상속 된 클래스의 유형을 구분합니다.
myMethod (final A a)
을하고 더 낫다고는 통해 인스턴스 객체의 타입의 경우에 다른 일을 좋아합니다. 내가 어떻게 해?
좋은 대안은 다른 디자인 패턴을 따르고 있지만 지금은 코드를 변경할 수 없습니다.
감사합니다.
instanceof
키워드를 사용하십시오. 예를 들어 다른 사람의 제안으로
if (a instanceof B) {...}
else if (a instanceof C) {...}
else {...}
사용 instanceof
운영자 :
myMethod (final A a) {
if(a instanceof B) {
//...
} else if(a instanceof C) {
//...
} else {
throw new IllegalArgumentException("Unknown type: " + a);
}
}
그러나 모든 OO 원칙에 대한 것은 좋은 방법이 있다는 점에 유의하십시오.
당신 은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를 추가하는 경우
-1 슈퍼 클래스는 자신의 서브 클래스에 관해서는 안된다. 귀하의 예에서 새 서브 클래스가 올 때마다 Type에 다른 값을 추가하여 수퍼 클래스를 편집해야합니다. – splungebob
나는 개인적으로 이것과 함께 가지 않을 것이다. 나는 내 솔루션과 전염병과 같은 instanceof 솔루션을 피하기 위해 리팩토링을 할 것이다. OP가 그가 리팩토링 할 수 없다고 말하면, 나는 개인적으로 이것을 instanceof보다 선호한다. 다른 하위 클래스를 추가하면 내 솔루션은 유형에 대해 신경 쓰는 나쁜 코드가 있다는 사실을 즉시 경고합니다. 즉, 다른 하위 클래스를 추가 할 때 instanceof를 사용하는 코드 블록을 업데이트하는 것을 너무 쉽게 잊어 버릴 수 있습니다. – phippsnatch
myMethod가 A 클래스의 일부입니까? –
아니요, 그렇지만해야하며 매개 변수가 없어야합니다. –
알았어. 이것은 정확히 instanceof를 피하기 위해 제안하고 싶습니다. 각 서브 클래스는 myMethod를 오버라이드 (override) 해, 그 기능을 구현하는 방법으로 구현합니다. 그러나 만약 당신이 그 특정 디자인에 묶여 있다면, 당신이 받아 들인 해결책이 아마도 최고 일 것입니다. –