重构调用一堆构造函数,这些构造函数都采用相同的args

时间:2012-02-28 23:38:23

标签: c# constructor refactoring

我将如何重构:

if (cond1) {
    return new Class1(arg1, arg2, arg3);
}
else if (cond2) {
    return new Class2(arg1, arg2, arg3);
}
else if (cond3) {
    return new Class3(arg1, arg2, arg3);
}
...

我特别想避免重复arg1, arg2, arg3

2 个答案:

答案 0 :(得分:1)

制作工厂功能:

template<class Derived>
Base* instantiate(A arg1, B arg2, C arg3) {
    return new Derived(arg1, arg2, arg3);
}

使用有意义的密钥类型构建地图:

std::map<int, Base(*)(A, B, C)> factory;

factory[0] = instantiate<Class1>;
factory[1] = instantiate<Class2>;
factory[2] = instantiate<Class3>;

是的,对于int,这可能只是一个数组或std::vector,但我使用上面的std::map来提供通用解决方案。然后,您可以以明显的方式从工厂获取实例。对于任意条件,它必须是这样的:

int index = cond1 ? 0
    : cond2 ? 1
    : cond3 ? 2
    : throw std::runtime_error("Invalid index.");

return factory[index](arg1, arg2, arg3);

但根据你问题的具体情况,可能会有一种更健全的方法。

答案 1 :(得分:1)

使用 激活器

Type t = cond1 ? typeof(Class1) : cond2 ? typeof(Class2) : cond3 ? typeof(Class3) : null;
Activator.CreateInstance(t, new object[] {arg1, arg2, arg3});