c++ 有多个类用到了相同的属性和方法,但是又不能提到基类层级,有什么好办法减少代码的重复吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iamzhuyi
V2EX    问与答

c++ 有多个类用到了相同的属性和方法,但是又不能提到基类层级,有什么好办法减少代码的重复吗?

  •  
  •   iamzhuyi 2017-08-02 16:58:57 +08:00 2148 次点击
    这是一个创建于 3038 天前的主题,其中的信息可能已经有所发展或是发生改变。

    再加一个类,让多个类继承新加的类?想不到别的方法了。。。。

    13 条回复    2017-08-02 23:12:00 +08:00
    sikariba
        1
    sikariba  
       2017-08-02 17:03:40 +08:00
    用虚基类也不行么?
    mooncakejs
        2
    mooncakejs  
       2017-08-02 17:07:17 +08:00
    c++ 可以直接多重继承啊。
    YyYyYyy
        3
    YyYyYyy  
       2017-08-02 17:41:49 +08:00   1
    把共同的部分拆成一个组件类,给每个类加上这个组件

    根据你的业务逻辑可能还可以参考其他模式比如命令模式

    多重继承不是不能用,如果能用设计模式回避掉的话那就不去用多重继承。要是换个语言也不一定有多重继承给你用。
    iamzhuyi
        4
    iamzhuyi  
    OP
       2017-08-02 17:48:23 +08:00
    @YyYyYyy 是的,我们组长是绝不可能让我们用多重继承的。。。
    geelaw
        5
    geelaw  
       2017-08-02 17:57:59 +08:00 via iPhone
    属性?

    多继承+虚拟基类( C++版接口)
    geelaw
        6
    geelaw  
       2017-08-02 18:01:25 +08:00 via iPhone
    另一个方法:设原基类叫 Base,建立一个叫 Base2 的类继承 Base,然后加上这些玩意儿,然后让其他类继承 Base2。

    我感觉不能提到基类多半是因为 ABI 吧,这样就可以保以前的代码都对。
    YyYyYyy
        7
    YyYyYyy  
       2017-08-02 18:16:50 +08:00
    @geelaw 我个人觉得在有属性的情况下还是避免用接口比较好(当然 C++实现的“接口”没有那么严格要求只有 method,的确可以放些 field 进去简化工作)

    LZ 你要不说下业务逻辑?
    morefreeze
        8
    morefreeze  
       2017-08-02 20:55:36 +08:00
    不提到基类不让继承那就用组合?写个类,然后用到的类直接把这个当成员
    veelog
        9
    veelog  
       2017-08-02 21:09:02 +08:00 via iPhone
    委托模式?
    harry890829
        10
    harry890829  
       2017-08-02 21:13:33 +08:00
    这种情况下,提炼出一个类,里面是 static 的成员?不过这个确实也看实际的函数使用场景,要是能够从类中独立出来的话应该没什么问题
    Miy4mori
        11
    Miy4mori  
       2017-08-02 21:16:13 +08:00 via iPhone
    继承不行就组合呀
    derek80
        12
    derek80  
       2017-08-02 22:18:48 +08:00 via Android
    重合的独立拿出来,组合一下
    acros
        13
    acros  
       2017-08-02 23:12:00 +08:00   1
    信息不够啊,但多重继承肯定被排除的

    能想到的可选项:
    1. 抽离出一个独立类,而且 API 很可能是静态的吧。一般这个可能性最大吧,大一点的项目都有 Utils 类什么的。
    2. 做成类的一个 Component (这个叫什么模式来着,组合模式?)
    3. 独立一个类,API 只开放给友元(似乎有点变态?)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5577 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 03:03 PVG 11:03 LAX 19:03 JFK 22:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86