2010-12-03 7 views
3

캐스트에 다운 될 수없는 것을 다운 캐스트하려고하고 올바른 접근 방식이 무엇인지 궁금합니다. 유스 케이스의 경우 확인 된 규칙 목록과 실패한 규칙 목록을 생성합니다. 실패한 규칙은 규칙의 하위 클래스입니다. 하지만 다운 캐스팅 같은 것
FailedRule failedRule = (FailedRule) rule; 규칙 객체가 나는 복제를 인스턴스화Java에서의 강제 다운 캐스팅

는이 문제를 해결하기 위해의 인스턴스의 FailedRule하지 않기 때문에

이 실패합니다;
FailedRule failedRule = new FailedRule (규칙);

내 FailedRule 클래스는이 작업을 수행 할 수있는 쉬운 방법이 있나요이

public class FailedRule extends Rule{ 

/* 
*force a down cast from Rule to FailedRule through cloning 
*/ 
public FailedRule (Rule upcast){ 
    super.setRuleCode(upcast.getRuleCode()); 
    super.setType(upcast.getType()); 
    .. 

처럼 보인다? 자신에 대답하기 위해 가, 디자인은 결함이 코드는해야한다 :

public class FailedRule{ 
    private Rule rule; 
    .. 
    public setRule(Rule rule){ 
    .. 
+0

을 어떻게 casted_ 수없는 개체에 downcast 강제로하는 데 결국 궁금하네요. 당신이 정말로하고 싶은 것을 우리에게 설명하십시오. –

+0

나도 그래 :-). 규칙 목록을 반복하고 실패한 규칙 목록을 반환합니다. 점검 프로세스는 왜, 언제, 어떻게 실패했는지에 대한 규칙 당 정보량을 상당량 반환합니다. 마크의 대답은 정확하고, 나의 디자인은 틀렸고 실패한 규칙은 '규칙'이라고 말할 수는 없다. 그것은 '규칙이 있습니다. 이 주석에 코드를 넣을 수 없기 때문에 질문을 편집했습니다. – Meindert

답변

2

이것은 상속 계층 구조가 약하게 표현 된 증상 일 수 있습니다. 상속을 통해 속성의 변경 가능성을 도입하려고합니다 (Rule은 인스턴스 인 경우 "실패"했습니다) - FailedRule입니다. 상속은 그런 종류의 일에 정말로 좋지 않습니다.

나는 컴포지션 (FailedRule에는 규칙으로 소스가 있음)을 사용해야하며 failedRule의 부울 속성이어야한다고 말하고 싶습니다.

+0

+1 그것은 디자인 문제입니다. –

+0

FailedRule은 실패한 규칙이 규칙이 아니기 때문에 규칙의 하위 클래스가 아닙니다. FailedRule 클래스는 규칙을 속성으로 가지는 실패한 규칙입니다. failedRule.setRule (규칙); failedRule.setReason (이유) 등. – Meindert

+0

@Meindert : 컨텍스트가 많지 않기 때문에 좋은 접근 방법인지 아닌지 잘 모르겠습니다. 'FailedRule'이 제공하는 또 다른 측면은 무엇입니까? * 실패한 규칙의 내부 상태는 어떻게 바뀌 었습니까? * 그것이 나라면 '실패한 규칙 목록에 규칙이 나타나면 규칙이 실패했습니다.'라고 말합니다. 규칙의 개념을 실행 결과와 분리하는 것이 논리적 인 것처럼 보입니다. 자동차가 마지막 경주에서 득점 한 장소를 자동차 자체에 저장하지 않는 것처럼, 차를 참조하는'RaceRecord'가 있어야합니다. –

0

더 쉬운 방법이있다. 너는 이것을 정확하게하고있다. 내가 정의 할 필요가있는 경우

 
private void copyFromRule(Rule otherRule) { 
    this.setRuleCode(otherRule.getRuleCode()); 
    this.setType(otherRule.getType()); 
    ... 
} 

이 방법, 나는이 같은 생성자에서 호출, 또한 clone() 방법으로 할 수 있습니다

여러 번, 나는 이런 식으로 뭔가를 개인 방법을 쓸 것 하나.

또 다른 요점은 super.setRuleCode 또는 this.setRuleCode으로 전화하는 것입니다. 이 두 가지는 FailedRulesetRuleCode을 재정의하는지에 따라 다른 작업을 수행합니다.

+0

-1, 문제는 디자인입니다. 마크 피터스의 대답을보세요. –

1

당신은 합리적인 해결책처럼 보입니다. 규칙이 실패한 규칙 일 가능성이있는 경우이를 Rule.isFailed()으로 모델링하는 것이 더 적절할 수 있습니다.

편집 :실패은 규칙의 변형이 아니라 매우 유사합니다. 그렇다면 Rule.isFailed()도 선호 할 것입니다.

  Rule 
     / \ 
     |  \ 
    FailableRule RuleC 
    / | 
RuleA RuleB 

흠 ... 실제로 failable 규칙 오류에 빠지기 쉬운 규칙입니다 : 정말 실패하지 않는 규칙이있는 경우, 우리는 다음과 같이 그 모델 수 있을까? Gaawgh ... 언어학.

+0

메소드가'Rule'에'return false;'만을 포함하고'FailedRule'에서'true true;를 되 돌리는 경우에도 이것은 좋은 아이디어입니다. –

+0

실제로 다른 것을 생각했습니다. * 실패 *는 규칙의 변형이 아닌 규칙의 상태와 매우 비슷하게 들립니다. 그렇다면'FailedRule'은별로 좋지 않습니다. –

+0

질문은, 그러나, 그의 디자인 선택을 평가하지 않는 downcasting에 관하여이다. –

0

클래스를 하위 클래스로 캐스팅 할 수 없습니다. 하위 클래스의 메서드 나 변수가 없으므로 의미가 없습니다. 네가 그렇게하는 방식.

0

당신이하고있는 방식이 정확합니다. 추가해야 할 유일한 주석은 복사 코드를 Rule 자체로 이동시키는 것입니다.

public class FailedRule extends Rule{ 

/* 
*force a down cast from Rule to FailedRule through cloning 
*/ 
public FailedRule (Rule upcast){ 
    super(upcast); 
    //init FailedRule fields to defaults 
} 
} 

public class Rule { 

publiic Rule(Rule ruleToCopy) { 
    //or even use the fields themselves. 
    this.setRuleCode(ruleToCopy.getRuleCode()); 
    this.setType(ruleToCopy.getType()); 
    ... 
+0

덕분에 그것은 더 깨끗한 복제 방법입니다.ruleToCopy의 모든 속성을 'this'에 배치하는 '자동 복제'방법을 찾고있었습니다. 그러나 나는 나의 디자인에 결함이있다는 표시로부터의 대답과 함께 간다. – Meindert

2

FailedRule에 대한 규칙을 변환하는 방법을 사용합니다 (그렇지 않으면 규칙이 이미 FailedRule이며, 출연진과 그것을 돌려 경우 FailedRule 구성하는 데 사용)

public static FailedRule asFailedRule(Rule rule){ 
    return (rule instanceof FailedRule) 
    ? (FailedRule) rule 
    : new FailedRule(rule) 
}