84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
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