2016-07-01 10 views
-1

私は、次のアプリケーション・ロジックがあるとします。C++階層クラス継承のデザイン

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

はコンフィグ構造を設計することが良好なパターンますか?現在私がやっているのは

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

「cond1'と 'cond2'とは何ですか?クラス 'classA'と' classB'を一度作成するとどうしたいですか?それらを漏らして良い選択のようには聞こえません... – skypjack

+0

それは不完全なコードです。私はいくつかの設定ブランチがあることを意味します。ブランチはConfigA内で続行できます。 – Alfred

+0

[mvce](http://stackoverflow.com/help/mcve)を提供してください。 – skypjack

答えて

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 IConfig trueになり、このような溶液を用いて確認してください。(まだ作業が必要がありますが、それはスタートだ)、このような何かを - インタフェースパターンを使用することを検討して、言った

initialは、作成するクラスと一致するタイプConfigAです。インターフェイス自体にそのようなことを確認するために、さらに多くのチェックを追加することができます。定数を返す仮想メソッドは十分に良いはずですが、実際にはこれを行う際に達成しようとしていることに依存しています。

例えば、おそらくIConfigへのローカル設定は、両方を決定するために使用することができ - ロードするクラス、今度はConfigクラスが使用されるべきかを決定する、など

付け足し - あなたはこの場合にはしたいことそれぞれClassにはIConfigという独自の実装があり、AppIConfigのデータを使用)で作成するクラスを決定できます。ここでも、あなたはこの構造で達成しようとしていることを知らずに(他のものとは対照的に)誰も確実に言うことができません。

+0

ありがとうございます。あなたの解決策は私が今得られる最高のものです。私のアプリケーションには動的派生クラスが含まれている可能性があり、異なるクラスには異なる設定があります。 Appの設定全体が1つのファイルで指定されています。私はこの場合に適した設定インターフェースについての設計パターンを見つけようとしていました。 – Alfred