C++的多继承很难理解,可是如果单继承又觉得以后无法扩展功能,object-c有protocol,C++没有。
那如何扩展类的功能呢?
谢谢!
人生最曼妙的风景,竟是内心的淡定与从容!
C++要想实现protocol或者java的interface,除了多继承没有它路了……怕冲突可以使用虚继承。 列出两种不怎么可行的做法:
一种是使用组合而非继承。 把想实现的一组功能定义为一个类A,然后把这个类A作为一个目标类B的一个成员。再给类B写出一组public方法,这些方法将通过转调类A的方法来实现功能。 但是这样做实现不了interface那样的功能。原因很明显,类A和类B不位于同一个类体系中。
第二种是使用模板。 假如某个类实现了一组想要的功能,我们就可以给这个类提供一个tag。如果有一个函数需要使用这一组功能,那么我们可以检查给的模板参数中是否有这么一个tag,如果没有这么一个tag,程序将不能通过编译。 但是这样比较复杂,真的决定要这么做么?
其实,如果不要求实现得像protocol,可以考虑使用工厂函数/对象。即提供一组参数作为函数/方法的参数,生成基类相同,但是对基类方法的实现有差别的一组子类。这样就能使用基类指针调用它们的方法。
java类实现接口的语义,就是c++里的虚继承,目的就是为了避免菱形继承的二义性问题。
C++中的设计模式对于你的这种扩展一般使用继承+组合来实现; 你可以考虑先使用一个抽象类Abstraction,用业务类RefinedAbstraction继承它; 然后,根据你的需要,将你需要进行功能扩展的接口以组合的形式(一般定义为指针)放到你的抽象类或者业务类中: Implementor:实现类接口 ConcreteImplementor:具体实现类
参考《图说设计模式》中桥接模式的这个图你就明白了:
详情请见:http://design-patterns.readthedocs.org/zh_CN/latest/structural_patterns/bridge.html
尽可能多用组合,少用继承,java,objC和C++都是
少用继承,多用 std::function / std::bing / lambda
C++要想实现protocol或者java的interface,除了多继承没有它路了……怕冲突可以使用虚继承。
列出两种不怎么可行的做法:
一种是使用组合而非继承。
把想实现的一组功能定义为一个类A,然后把这个类A作为一个目标类B的一个成员。再给类B写出一组public方法,这些方法将通过转调类A的方法来实现功能。
但是这样做实现不了interface那样的功能。原因很明显,类A和类B不位于同一个类体系中。
第二种是使用模板。
假如某个类实现了一组想要的功能,我们就可以给这个类提供一个tag。如果有一个函数需要使用这一组功能,那么我们可以检查给的模板参数中是否有这么一个tag,如果没有这么一个tag,程序将不能通过编译。
但是这样比较复杂,真的决定要这么做么?
其实,如果不要求实现得像protocol,可以考虑使用工厂函数/对象。即提供一组参数作为函数/方法的参数,生成基类相同,但是对基类方法的实现有差别的一组子类。这样就能使用基类指针调用它们的方法。
java类实现接口的语义,就是c++里的虚继承,目的就是为了避免菱形继承的二义性问题。
C++中的设计模式对于你的这种扩展一般使用继承+组合来实现;
你可以考虑先使用一个抽象类Abstraction,用业务类RefinedAbstraction继承它;
然后,根据你的需要,将你需要进行功能扩展的接口以组合的形式(一般定义为指针)放到你的抽象类或者业务类中:
Implementor:实现类接口
ConcreteImplementor:具体实现类
参考《图说设计模式》中桥接模式的这个图你就明白了:
详情请见:
http://design-patterns.readthedocs.org/zh_CN/latest/structural_patterns/bridge.html
尽可能多用组合,少用继承,java,objC和C++都是
少用继承,多用 std::function / std::bing / lambda