iamzhuyi
V2EX  ›  问与答

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

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

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

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

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

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

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

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

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

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