V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
iamzhuyi
V2EX  ›  问与答

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

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

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

    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   ·   实用小工具   ·   2647 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:54 · PVG 17:54 · LAX 01:54 · JFK 04:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.