2014-10-25 5 views
1

내가이 유형의 질문을할만한 장소인지 확신 할 수 없으므로 관련이없는 경우이 질문을 닫으십시오.OO 디자인 관련 문제

저는 OO 디자인에 대해 배우고 있으며 간단한 로봇 시스템에 좋은 디자인을 만드는 데 문제가 있습니다. 여기에 그 요지가 있습니다 :

드라이버는 로봇 객체를 조작합니다. RobotBasicRobotHandicapRobot이 구현하는 인터페이스입니다.

여기에 문제가 있습니다. BasicRobot은 코드를 모두 가지고 있으며 HandicapRobot은 두 변수 만 다릅니다. 즉, BasicRobot에는 모든 방향의 센서가 있고 HandicapRobot에는 왼쪽 및 오른쪽 센서 만 있습니다. 그들은 매우 유사하므로 HandicapRobotBasicRobot에서 상속 받았습니다.

그러나 어떤 경우에는 BasicRobot 만 사용할 수 있으며 HandicapRobot을 사용하는 것은 적절하지 않습니다. 부모 클래스가 필요할 때마다 하위 클래스를 사용할 수 있으므로 대체 규칙을 위반합니다.

나는 우아한 방법으로이 문제를 해결하는 방법을 잘 모르겠습니다. HandicapRobot을 없애고 BasicRobot에 대한 센서 수정자를 생성해야합니까?

+0

의미를 명확히하기 위해 핸디캡 로봇이 일반 로봇이지만 "고장난"것으로 간주됩니까? 그렇다면, 나는 그것이 자신의 클래스라는 것이 합리적이라고 확신하지는 않지만 대신에 기본 로봇의 깨진 버전처럼 작동하도록 엔트로피를 내장 할 것입니다. – trnelson

+0

@trnelson 더 작은 버전의 BasicRobot으로 간주됩니다. 능력이 적습니다. – mrQWERTY

+0

"어떤 상황에서는"기본 로봇 만 사용할 수 있다는 것은 무엇을 의미합니까? 그리고 두 개의 로봇이 변수 값으로 만 다른 경우 다른 클래스가 아닌 동일한 클래스의 인스턴스처럼 들릴 것입니다. –

답변

2

HandicapRobot이 사용될 수있는 곳이면 BasicRobot을 사용할 수 있지만 BasicRobot을 사용할 수있는 곳이면 HandicapRobot을 사용할 수 없습니다. 이는 HandicapRobot이 기본 클래스 여야 함을 의미합니다.

그렇다면 계층 구조에 다른 문제가있을 수 있습니다. 다른 두 변수가 bool 인 경우 기본 클래스에서 일부 코드를 분리하여 파생 클래스에 넣어야 할 가능성이 큽니다.

+0

안녕하세요, 저는 이것에 대해 생각해 봤습니다. 결국 Robot 인터페이스를 부분적으로 구현 한 AbstractRobot을 사용하게되었습니다. 그런 다음 BasicRobot과 HandicapRobot이 AbstractRobot을 확장했습니다. – mrQWERTY

1

데코레이터 디자인 패턴의 응용 프로그램처럼 보입니다. 다음과 같은 인터페이스를 만들어야합니다. IRobot은이 인터페이스 인 BasicRobot과 HandicapedRobot을 구현하는 두 개의 클래스를가집니다. HandicapedRobot은 IRobot을 통해 BasicRobot의 인스턴스를 포함합니다.

interface IRobot{} 

class BasicRobot : implements IRobot{} 

class HandicapedRobot : implements IRobot{ 
IRobot m_internal; 
SomeType m_additionalData; 
}