【问题标题】:C++ hierarchical class inheritance designC++层次类继承设计
【发布时间】:2016-11-03 09:46:53
【问题描述】:

假设我有以下应用逻辑:

class classA
{
    classA(ConfigA config)
};

class classB
{
     classB(ConfigB config)
};

class App
{
    void initial(Config config){
        if( cond1)
            new classA(config.getConfigA());
        if( cond2)
            new classB(config.getConfigB());
     }
};

有没有好的模式来设计 Config 结构?目前我正在做的是

struct BConfig
{
     int a;
     int b;
};

struct ConfigA:public BConfig
{
     int c;
};
struct ConfigB:public BConfig
{
     int d;
};
struct Config
{
    ConfigA getConfigA();
    ConfigB getConfigB();
    int a;
    int b;
    int c;
    int d;
};

我想有更好的方法来做到这一点。有什么建议吗?

【问题讨论】:

  • cond1cond2 是什么?类classAclassB 创建后要做什么?让他们泄漏听起来不是一个好的选择……
  • 这是不完整的代码。我的意思是有一些配置分支。分支可以在 ConfigA 中继续。
  • 请提供mvce
  • @skypjack 很抱歉,但它已经是一个 mvce。这是关于如何设计顶级配置结构。
  • 这是某种变异的工厂模式吗?

标签: c++ design-patterns multiple-inheritance


【解决方案1】:

这听起来像是一个 XY 问题。您有一个正在尝试使用的特定解决方案,它可能是也可能不是您最初问题的答案。此外,您在示例中对 new 的使用不完整,不清楚何时或如何释放 Class 对象。

也就是说,考虑使用界面模式 - 类似这样的东西(仍然需要工作,但这是一个开始):

struct IConfig {
  // TODO: identification as to which class instance this is.
  // and/or virtual methods
  int a;
  int b;
  virtual ~IConfig(){}
};

struct ConfigA : public IConfig {
  int c;
  virtual ~ConfigA(){}
};

struct ConfigB : public IConfig {
  int d;
  virtual ~ConfigB(){}
};

class IClass {
  // TODO: identification as to which class instance this is.
  // and/or virtual methods
  virtual ~IClass(){}
};

class ClassA : public IClass {
  public:
    ClassA(const IConfig & iconf) {
      ConfigA & aconf = dynamic_cast<ConfigA&>(iconf);
    }
  virtual ~ClassA(){}
};

class ClassB : public IClass {
  public:
    ClassB(const IConfig & iconf) {
      ConfigB & bconf = dynamic_cast<ConfigB&>(iconf);
    }
  virtual ~ClassB(){}
};

class App {
    IConfig * config; // in case
    IClass * cls;
    void initial(IConfig config){
      if( cond1 )
        cls = new ClassA( config );
      else if( cond2 )
        cls = new ClassB( config );
      else
        // ...
    }
};

只需确保cond1 将是真的这样的解决方案 IIF 传递给initialIConfig 的类型是ConfigA 以匹配正在创建的类。您可以添加更多检查以确保界面本身就是这种情况。返回常量的虚拟方法应该足够好,但它实际上取决于您在执行此操作时要达到的目标,因为这似乎已经是一种混乱的方法了。

例如,也许IConfig 的本地配置可用于确定两者 - 加载哪个类,进而确定应使用哪个 Config 类等。

事后考虑——在这种情况下,您可能希望让每个Class 都有自己的IConfig 实现,这让App(使用IConfig 数据)确定要创建哪个类。同样,在不知道你想用这种结构(而不​​是其他结构)实现什么的情况下,没有人可以肯定地说。

【讨论】:

  • 谢谢。你的解决方案是我现在能得到的最好的。由于我的 App 可能包含动态派生类,并且不同的类有不同的配置。整个 App 配置在单个文件中指定。我试图找到一种适合这种情况的关于配置接口的设计模式。
猜你喜欢
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多