2011-02-26 2 views
0

기본 클래스가 있으므로 기계 작동 결과를 저장하는 DispenseResult라고 부르 자고합니다. 나는 기계 군을 디자인하고있다. DispenseResult에는 모든 컴퓨터에 적용 할 수있는 멤버 변수가 포함됩니다 (예 : 작업 중에 그려지는 현재).자바 캐스팅을 사용하는 객체 지향 디자인과 기본 클래스보다 많은 멤버 변수를 가진 파생 클래스

필자는 특정 특수 기계를 모델링하기 위해 파생 클래스가 필요하다고 생각했습니다. MotorizedDispenseResult. 모터 함수와 관련된 멤버 변수가 있습니다.

클라이언트 코드의 일부는 DispenseResult (또는 파생 클래스)에서 이러한 다양한 멤버 변수를 가져 와서 로그하는 것입니다.

 

void log(DispenseResult result) { 
    // store results common to all machines 
    log("current = " + result.getCurrent()); 

    // store results for specialized cases 
    if (result instance of MotorizedDispenseResult) { 
    log("error = " + ((MotorizedDispenseResult)result).getMotorError()); 
    ... etc. 
    } 
} 
 

이 새로운 파생 된 형식은 모든 instanceof를 검사하여 만든으로 혼란스러워 할 것입니다 : 나는 그것을 할 경우 방법은 내가 같은 코드로 끝날 것 이상으로 설명했다. 그것을 할 수있는 더 깨끗한 방법이 있습니까?

TY, 프레드

답변

1

옵션 1

  1. 가능성이 추상 기본 클래스의 메소드를 만듭니다.
  2. 하위 클래스에 메소드가 구현되어 있습니다.
  3. 형식 확인을 수행하는 대신 해당 메서드를 호출하십시오.

그런 식으로 모든 하위 클래스 특정 편차는 다른 하위 클래스 대신 하위 클래스에 있습니다. 2

기능은 클래스 계층 구조 외부에 거주해야하는 경우

옵션, 내가 뭘 할 것은

  1. 는 방법 '실행'과 인터페이스 '핸들러'를 정의한다. 앱에서 수행중인 작업에 따라 이름을 지정합니다.
  2. 각 하위 클래스에 대한 구현을 만듭니다.
  3. Map<SpecificClass, Handler>
  4. 유형에 if 문을 수행하는 경우 맵에서 해당 핸들러를 찾아 실행하십시오.

왜 광범위한 if 문을 작성할 필요가 없으므로지도를 대신 사용할 수 있습니다. 이것은 또한 테스트하기 쉽고, Handler가 독립적으로 테스트 할 수 있습니다.

+0

감사합니다, 아주 분명 지금, 나무 : –

+0

@fred, 쉽게이 물건 아닌가요의 나무를보고되지 않았다). 잃어 버리기 쉽습니다. – hvgotcodes

0

이 클래스에서 필요한 항목에 따라 다릅니다. 예를 들어, 특정 오류 메시지 만 원하는 것 같습니다. 수퍼 클래스에 메서드 getError을 추가하기 만하면 하위 클래스가이를 오버라이드해야합니다.

0

은 DispenseResult 클래스에서 다형성 메서드 print()를 제공합니다. 인쇄물 자체는 이러한 개체 군의 책임입니다.

2

OO Design에서는 클래스에 동작을 추가하고보다 특수화 된 동작을 제공하기 위해 하위 클래스에서이를 무시합니다.

예 :

class DispenseResult 
{ 
    String log() 
    { 
     return "current = " + getCurrent(); 
    } 
} 


class MotorizedDispenseResult extends DispenseResult 
{ 
     @Override 
     String log() 
     { 
      String s = super.log(); 
      s += "error = " + getMotorError(); 
      return s; 
     } 
    } 
관련 문제