改进C++类架构,其中许多类来自同一个两个基 我有一个C++架构,我有很多类,它们都是由两个不同的基类派生而成。所有派生类都以略微不同的方式重写/实现基类中相同的方法。举例说明: class B1 { public: // method_1 is pure virtual. virtual void method_1() = 0; }; class B2 { public: // method_2 is not pure virtual. virtual void method_2(); }; class D1 : public B1, public B2 { public: virtual void method_1() { // Does something... } virtual void method_2() { // Does something... } }; class D2 : public B1, public B2 { public: virtual void method_1() { // Does something slightly different... } virtual void method_2() { // Does something slightly different... } };

改进C++类架构,其中许多类来自同一个两个基 我有一个C++架构,我有很多类,它们都是由两个不同的基类派生而成。所有派生类都以略微不同的方式重写/实现基类中相同的方法。举例说明: class B1 { public: // method_1 is pure virtual. virtual void method_1() = 0; }; class B2 { public: // method_2 is not pure virtual. virtual void method_2(); }; class D1 : public B1, public B2 { public: virtual void method_1() { // Does something... } virtual void method_2() { // Does something... } }; class D2 : public B1, public B2 { public: virtual void method_1() { // Does something slightly different... } virtual void method_2() { // Does something slightly different... } };,c++,architecture,C++,Architecture,一切都很好,但由于大约有20个派生类,所以感觉应该有一种方法来改进这种设计,这样我就可以编写更少的代码,特别是派生类的工作方式通常非常相似。有谁能为我提供一些未来的指导吗?如果不了解您的实现领域,即您的程序试图建模的内容,几乎不可能分析或建议更好的设计。这里有一个非常宽泛的陈述,在极少数情况下,使用一般形式的多重继承是合理的,即除了通过接口继承行为之外。同样,这是一个总括语句,根据域的不同,它仍然有一些例外 看看战略设计模式。基本上,将方法1和2包装在B1和B2类上,这些类由类D的唯一指针拥有。

一切都很好,但由于大约有20个派生类,所以感觉应该有一种方法来改进这种设计,这样我就可以编写更少的代码,特别是派生类的工作方式通常非常相似。有谁能为我提供一些未来的指导吗?

如果不了解您的实现领域,即您的程序试图建模的内容,几乎不可能分析或建议更好的设计。这里有一个非常宽泛的陈述,在极少数情况下,使用一般形式的多重继承是合理的,即除了通过接口继承行为之外。同样,这是一个总括语句,根据域的不同,它仍然有一些例外

看看战略设计模式。基本上,将方法1和2包装在B1和B2类上,这些类由类D的唯一指针拥有。然后,您可以在D的构造函数中传递B1和B2实例。

它们都从B1和B2继承吗?然后,您可以首先将B1和B2替换/合并为一个单独的类B。method1通常可以用method2实现吗?@Axel它们都继承自B1和B2,所以我可以这样做。但我的直觉告诉我,这是不好的,因为这两个碱基是不同的——我将在@Alexander L.Belikoff的回答中再补充一点@Matteo,我不这么认为。为什么有这么多类似的类?我想第一个问题是D1和D2之间的差异是否可以以某种方式参数化。这很公平。我想这个领域是一个嵌入式处理器上的菜单系统。B1是所有Ds实现的抽象回调类。B2是一个服务类,在没有RTOS的情况下模拟任务环境。所有的Ds都是菜单选项,用户可以选择它来做一些独特的事情。。。那么你真的需要从B2继承吗?在这种情况下,使用它而不是继承它会更干净吗?在这种情况下,您只有一个菜单回调类可从中继承。我想我确实给出了我当前的设计,因为否则我看不到一种让每个菜单选项由底层硬件计时器提供服务的简洁方法?这感觉就像我会在Ds中引入不必要的网关,而不会派生?如果我没有派生,在不引入其他接口和更多代码的情况下,如何影响派生类?这看起来可能是一个选项。你能不能用一个实现来详细说明一下,虽然我能找到一个关于模式的合理解释,但这个方法对我来说有点抽象请原谅这个双关语…我,虽然我能看到通过接口实现所有选项的设计好处,但我不得不在这里写更多的代码,而不是更少。Hmmm.更少的代码不一定意味着更好的可维护性/灵活性等。在这种特殊情况下,使用两种策略而不是多重继承可能会很有用,例如,当您拥有具有相同函数_1但不同函数_2的类D时。否则不会有直接的好处,但是,除非您有充分的理由不这样做,否则最好选择组合而不是继承。请阅读本文,以获得良好的概述。