如何避免重新声明子方法,仍然为不同的子类定义不同的方法?

Posted

技术标签:

【中文标题】如何避免重新声明子方法,仍然为不同的子类定义不同的方法?【英文标题】:How to avoid re-declaring child methods and still define different methods for different child classes? 【发布时间】:2017-07-17 13:23:00 【问题描述】:

目前,我在Setplay.h 中声明了一个父类和两个子类,因此

namespace agent 

class Setplay 
public:
    virtual int reset() return 0;;
;

class ChildSetplay1 : public Setplay 
public:
    virtual int reset();
;

class ChildSetplay2 : public Setplay 
public:
    virtual int reset();
;


Setplay.cpp 中,我定义了方法

namespace agent 

int ChildSetplay1::reset()
    return 1;


int ChildSetplay2::reset()
    return 2;



有没有办法避免在.h 中重新声明方法,并且仍然为每个孩子定义唯一的方法?

如果我避免在.h 中重新声明方法:

namespace agent 

class Setplay 
public:
    virtual int reset() return 0;;
;

class ChildSetplay1 : public Setplay ;
class ChildSetplay2 : public Setplay ;


然后我得到以下错误:

错误:在类“agent::ChildSetplay1”中没有声明“int agent::ChildSetplay1::reset()”成员函数

但是如果我将方法的签名更改为类似的东西,我无法为每个孩子定义不同的方法

int reset()
    return ??; // return 1? 2?

我不确定有没有办法做到这一点,但我的动机是:

实际的类有几个方法,而且总是重新声明一切看起来很难看

我仍然需要将所有内容保存在 .cpp.h

那么,有可能吗?还是有更好的选择?

【问题讨论】:

.h 和 .cpp 需要匹配所以不行。 【参考方案1】:

你需要为每个孩子定义函数,所以你不能逃避它。你可以做的是,如果你有多种功能,那就多走一走,使用#define 喜欢:

#define SET_PLAY_FUNCTIONS public:\
                           virtual int reset();\
                           virtual int go(); 
namespace agent 

class Setplay 
public:
    virtual int reset() return 0;;
    virtual int go();
;

class ChildSetplay1 : public Setplay 
    SET_PLAY_FUNCTIONS
;

class ChildSetplay2 : public Setplay 
    SET_PLAY_FUNCTIONS
;


至少你可以保存一些东西.....

【讨论】:

以上是关于如何避免重新声明子方法,仍然为不同的子类定义不同的方法?的主要内容,如果未能解决你的问题,请参考以下文章

抽象类,抽象函数

九重写,重载,和new隐藏的用法区别

以不同方式处理子类/避免代码重复

Java 接口的所有子类都需要执行相同处理逻辑的推荐姿势

设计模式——模板方法模式

Go 软件设计之道:1 对不同类型的数据进行分组 #私藏项目实操分享#