명령 패턴 클래스에 대한 질문

해결됨
기모찌 프로필

안녕하세요. 명령 패턴으로 포탄 예제 구현예제에 관해 질문드립니다.

포탄 발사 명령을 구현하기 위해 Actor 클래스에 순수 가상 fire 함수를 생성하고 MyTank 클래스에서 fire 함수를 오버라이딩해서 구현했습니다.

만약 탱크, 비행기, 로봇 등 다양한 클래스를 구현해야하고, 각각 고유한 기능 구현해야한다면, Actor를 상속 받는 모든 클래스가 불필요한 기능을 모두 구현해야하는데 이런 문제를 해결하는 방법이 있을까요?? (자식 클래스에만 정의하면 base reference or pointer를 통해 호출할수 없는 문제가 있습니다.)

 

바쁘실텐데 죄송하네요...

class Actor
{
public:
	virtual void moveUp(float dt) = 0;
	virtual void moveDown(float dt) = 0;
	virtual void moveLeft(float dt) = 0;
	virtual void moveRight(float dt) = 0;
	virtual void fire() = 0;   // for tank
	virtual void fly() = 0;   // for aircraft
	virtual void transform() = 0;   // for robot
};

class MyTank : public Actor
{
public:
	void moveUp(float dt) override {}
	void moveDown(float dt) override {}
	void moveLeft(float dt) override {}
	void moveRight(float dt) override {}
	void fire() override {}
	void fly() override {}
	void transform() override {}
};

class Aircraft: public Actor
{
public:
	void moveUp(float dt) override {}
	void moveDown(float dt) override {}
	void moveLeft(float dt) override {}
	void moveRight(float dt) override {}
	void fire() override {}
	void fly() override {}
	void transform() override {}
};

class Robot: public Actor
{
public:
	void moveUp(float dt) override {}
	void moveDown(float dt) override {}
	void moveLeft(float dt) override {}
	void moveRight(float dt) override {}
	void fire() override {}
	void fly() override {}
	void transform() override {}
};
PP TREE 프로필
PP TREE 3달 전

기모찌님 반갑습니다. 객체지향의 중요한 단계로 들어가고 계시네요. 군더더기 없는 코드를 작성하고 싶으시군요. 좋은 질문입니다. Actor를 GroundActor, TransformingActors, FlyingActors로 더 세분화하는 방법도 있고 순서 가상함수가 아닌 형태로 구현해서 필요없는 자식들은 구현할 필요가 없도록 하는 방법도 있습니다. virtual void fly(){Error if this is not flying actor }.

언리얼 엔진 들여다 보면 클래스도 많고 상속 구조도 꽤 여러 단계가 되기도 합니다. 조금 더 해보시면 감이 오실것 같네요. 좋은 게임 만들어서 보여주세요!

기모찌 프로필
기모찌 3달 전

빠른 답변 감사합니다.

혹시 필요한 기능을 자식 클래스에만 정의하고 해당 기능을 호출할 때, 다이나믹 캐스팅(다운 캐스팅)을 사용하는것도 괜찮은 방법이 될까요??