代码之家  ›  专栏  ›  技术社区  ›  shortCircuit77

抽象类有选择地公开基于派生类型的方法

  •  0
  • shortCircuit77  · 技术社区  · 2 年前

    我正在编写一个实现工厂的程序 TimeManager 生成两种类型的对象;一 Timer 和a StopWatch . 这两个对象都派生自抽象类 TimePiece ,并共享常用方法。我希望工厂返回类型 计时器 ,但因为 计时器 我不能实现额外的方法。我怎样才能 计时器 暴露 计时器 的额外方法,而不将其暴露于 秒表 何时创建这些各自的类型?我希望这是有意义的,因为这有点难以解释。

    时间管理器。h类

    enum TimePieceType{TIMER, STOP_WATCH};
    
    class TimeManager {
    public:
        TimeManager();
        ~TimeManager();
    
        void Tick();
        TimePiece* AddTimePiece(TimePieceType timeType);
    };
    

    计时器。h类

    enum RunningState { STOPPED, RUNNING, PAUSED };
    
    class TimePiece {
    private:
        unsigned long startTime = 0;
        unsigned long currentTime = 0;
        unsigned long pauseOffset = 0;
    
    protected:
        Time time;
        RunningState state = STOPPED;
    
    public:
        TimePiece() = default;
        virtual ~TimePiece() = default;
    
        void Stop();
        void Start();
        void Pause();
        void Resume();
        void Reset();
        virtual void Tick();
    
        Time GetTime();
        RunningState GetState();
        virtual uint8_t GetId() = 0;
    };
    

    秒表h类

    class StopWatch : public TimePiece {
    private:
        uint8_t watchId = 0;
        static int8_t currentId;
        
    public:
        StopWatch();
        virtual ~StopWatch();
    
        uint8_t GetId();
    };
    

    计时器。h类

    class Timer : public TimePiece {
    private:
        uint8_t timerId = 0;
        static int8_t currentId;
        unsigned long timeout;
    
    public:
        Timer();
        ~Timer();
    
        void Tick() override;
    
        void SetTimeoutMs(unsigned long timeout);
        void SetTimeoutSec(unsigned long timeout);
    
        uint8_t GetId();
        Time GetRemainingTime();
        unsigned long GetTimeout();
    };
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Sergey Kalinichenko    2 年前

    你不应该回来 TimePiece* 因为这两个子类共享 TimePiece 是为了它的实现,而不是为了它的接口。

    一个简单的方法是 TimeManager 两种不同的方法:

    Timer* AddTimer();
    StopWatch* AddStopWatch();
    

    如果需要,可以利用多态行为 Remove 方法:

    void RemoveTimePiece(TimePiece*);