C ++分层类继承设计

时间:2016-07-01 05:26:32

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

假设我有以下应用程序逻辑:

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;
};

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

1 个答案:

答案 0 :(得分: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为{II},IConfig传递给initial的{​​{1}}类型为ConfigA,以匹配正在创建的类。您可以添加更多检查以确保接口本身的情况。返回常量的虚拟方法应该足够好,但它实际上取决于您在执行此操作时要尝试实现的内容,因为它似乎已经是一种混乱的方法。

例如,可能会使用IConfig的本地配置来确定两者 - 要加载哪个类,这反过来决定应该使用哪个Config类等。

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