instanceof 또는 이와 동등한 코드 (http://www.javapractices.com/topic/TopicAction.do?Id=31, when should we use instanceof and when not)를 사용하는 것이 좋지 않다고 생각합니다. 주로 재사용하기가 어렵 기 때문에 동의 할 수 있습니다.instanceof 대신 사용할 수 있습니까?
그러나 일부 경우에는 instanceof에 대한 대안으로 생각하기가 어려웠습니다. 예를 들어, 실시간 전략 게임을 만들고 싶다고합시다. 이 게임은 장애물, 건물 및 탱크로 구성되며 모두 격자에 배치되며 각 권한은 격자에서 정확히 하나의 단위를 차지합니다. 그래서 나는 Obstacle, Building 및 Tank 클래스의 수퍼 클래스 인 Entity 클래스를 생성합니다. 그리드는 엔티티의 인스턴스로 구성됩니다. 업데이트가 진행되는 동안 각 탱크가 범위 내의 적 탱크를 조준하고 쏴야합니다. 따라서 쉬운 방법은 각 탱크가 탱크 범위 내의 모든 엔티티를 그리드에 요청한 다음 모든 엔티티를 반복하고 탱크 Tank의 인스턴스인지 확인하는 것입니다.
instanceof를 사용하는 것의 대안으로, 디자인 패턴 Visitor을 사용했습니다. 방문객은 엔터티 (entity->acceptVisitor(visitor))
에 의해 받아 들여지고, 그러면 visitor->visitObstacle(this)
, visitor->visitBuildig(this)
또는 visitor->visitTank(this)
중 하나가 호출됩니다. 그러나 이것은 많은 방문객을 만들어야했습니다. 실제로 엔티티를 만들고자하는 모든 작업마다 새로운 것이 하나 있습니다. 또 다른 문제는 많은 경우 방문자가 어떤 클래스를 구성하든 엔티티에서 동일한 메소드를 호출한다는 것입니다.
파이썬 코드 : 나는 물론,이 경우 기업은 또 다른 엔티티 경우를 물어 보자 수
class StationaryEntityGatherVisitor:
def __init__(self):
self.stationaryEntities = []
def visitObstacle(self, obstacle):
self._addIfStationary(obstacle)
def visitBuildig(self, building):
self._addIfStationary(building)
def visitTank(self, tank):
self._addIfStationary(tank)
def _addIfStationary(self, entity):
if entity.isStationary():
self.stationaryEntities.append(entity)
def getStationaryEntities():
return self.stationaryEntities
기업이 다른 기업이 정지 여부가 있는지 확인하고자 할 때, 예를 들면 일어날 수 그것은 방문자가 그렇게하는 대신에 직접 움직이지 않습니다. 그러나이 경우 엔티티의 속성을 확인하는 데있어 일관성이 없습니다. 엔티티 유형을 확인해야하는지에 따라 엔티티에게 (직접 또는 방문자를 통해) 일부 속성을 묻는 메소드가 달라 지도록하려면 내 의견으로는 꽤 이상한 디자인처럼 보일 것입니다.
그래서 위에서 설명한 문제에서 instanceof를 사용하는 대신 다른 방법이 있습니까?
감사합니다. Martin
저는이 문제점을 이해하지 못했을 수 있다는 면책 조항과 함께 모든 답변을 시작하는 습관이 있습니다. :) 이것은 일반적인 snobbishness를 피하기위한 것이지만, 해결책이 당신을 위해 잘 작동하지 않는다면 저에게 의견을 말하십시오. –