假设我有以下应用程序逻辑:
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;
};
我想有更好的方法来做到这一点。有什么建议吗?
答案 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
数据)可以确定哪个类创建。同样,在不知道你用这种结构试图实现什么的情况下(与其他结构相反),没有人可以肯定地说。