728x90

1. 하위 클래스 샌드박스 패턴 정의

  • 상위 클래스가 제공하는 기능들을 통해서 하위 클래스에서 행동을 정의하는 패턴
  • 제공 기능은 protected로 만들어져 하위 클래스용이라는 걸 분명히 하여 사용한다.

 

2. 상위 클래스 구현

class Superpower
{
public:
    virtual ~Superpower() {}

protected:
    virtual void Activate() = 0;

    void Move( double InX, double InY, double InZ )
    {
        //..
    }

    void PlaySound( SoundId InSoundId, double InVolume )
    {
        //..
    }
};
  • Activate() 는 샌드박스 메서드다. 순수 가상 함수로 만들었기 때문에 하위 클래스가 반드시 오버라이드해야 한다.
  • Move(), PlaySound() 함수는 제공 기능이며, 하위 클래스에서 Activate() 메서드를 구현할 때 호출한다.

 

3. 하위 클래스 구현

class SkyLaunch : public Superpower
{
protected:
    // 순수 가상함수 오버라이드
    virtual void Activate() override
    {
        // 상위 클래스에 정의된 제공 기능
        PlaySound( SOUND_SPROING, 1.f );

        //...
        //...
        //...
 
        // 상위 클래스에서 정의된 제공 기능
        Move( 0, 0, 0 );
    }
};
  • Activate() 는 샌드박스 메서드이므로 사용처에 맞게 자유롭게 구현할 수 있다.

 

4. 객체를 통해 메서드 제공

class FSoundPlayer
{
public:
    void PlayerSound( SoundId InSoundId, double InVolume ) {}
    void StopSound( SoundId InSoundId ) {}
    void SetVolume( SoundId, double InVolume ) {}
};

class Superpower
{
private:
    FSoundPlayer SoundPlayer;

public:
    virtual ~Superpower() {}

protected:
    virtual void Activate() = 0;

	// 제공 기능을 별도 객체를 통해 제공
    FSoundPlayer& GetSoundPlayer() { return SoundPlayer; }

    void Move( double InX, double InY, double InZ )
    {
        //..
    }
};


class SkyLaunch : public Superpower
{
protected:
    // 순수 가상함수 오버라이드
    virtual void Activate() override
    {
        // 상위 클래스에 정의된 제공 기능
		GetSoundPlayer().PlayerSound( SOUND_SPROING, 1.f );

        //...
        //...
        //...
 
        // 상위 클래스에서 정의된 제공 기능
        Move( 0, 0, 0 );
    }
};
  • 제공 기능 일부를 별도 객체를 통해 제공한다.
  • 상위 클래스의 메서드 개수를 줄일 수 있는 장점이 있다.
  • SuperPower 클래스 사운드 관련된 모든 의존을 SoundPlayer 클래스 하나에 캡슐화할 수 있어 커플링을 낮출 수 있다.
반응형

+ Recent posts