iamzhuyi
V2EX  ›  问与答

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

  •  
  •   iamzhuyi · Aug 2, 2017 · 2413 views
    This topic created in 3215 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

    能想到的可选项:
    1. 抽离出一个独立类,而且 API 很可能是静态的吧。一般这个可能性最大吧,大一点的项目都有 Utils 类什么的。
    2. 做成类的一个 Component (这个叫什么模式来着,组合模式?)
    3. 独立一个类,API 只开放给友元(似乎有点变态?)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3124 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 06:32 · PVG 14:32 · LAX 23:32 · JFK 02:32
    ♥ Do have faith in what you're doing.