【问题标题】:Code Refactoring by applying design pattern通过应用设计模式进行代码重构
【发布时间】:2012-06-19 03:04:10
【问题描述】:

我必须编写 3 个函数,它们接受 BaseClass 类型的参数,然后返回 DerivedClasses 作为返回值。

Public DerivedClass1 SimpleTest1(BaseClass baseType)
{
DerivedClass1 derivedClass1 = new DerivedClass1();
derivedClass1.item = baseType.item;
derivedClass1.itemGroup = baseType.itemGroup;
return derivedClass1;
}

Public DerivedClass2 SimpleTest2(BaseClass baseType)
{
DerivedClass2 derivedClass2 = new DerivedClass2();
derivedClass2.item = baseType.item;
derivedClass2.itemGroup = baseType.itemGroup;
return derivedClass2;
}

Public DerivedClass3 SimpleTest3(BaseClass baseType)
{
DerivedClass3 derivedClass3 = new DerivedClass3();
derivedClass3.item = baseType.item;
derivedClass3.itemGroup = baseType.itemGroup;
return derivedClass3;
}

这3种方法写的代码都是一样的!有没有更好的方法来实现这一点,而无需重复代码?我可以在这里应用特定的设计模式吗?

【问题讨论】:

    标签: c# oop design-patterns


    【解决方案1】:

    在此使用泛型,您可以很好地表达它:

    public T SimpleTest<T>(BaseClass baseType) where T : BaseClass, new()
    {
        T derived = new T();
        derived.item = baseType.item;
        derived.itemGroup = baseType.itemGroup;
        return derived;
    }
    

    有一个警告,您必须拥有一个默认构造函数,否则这将不起作用。如果您有一个带有一个或多个参数的构造函数(但每个参数的签名相同),您可以使用反射动态实例化该类,如 dbaseman 的回答。

    【讨论】:

    • 有趣。对使用 new T() 与 dbaseman 使用 Activator.CreateInstance() 的赞成、反对有何看法?
    • @dreza:根据this的回答,没有。
    • 我认为最好有一个 where new() ,因为它说明了可以使用哪种类型。
    • 我也将它简化为 public T SimpleTest(BaseClass baseType) where T:BaseClass, new() { return new T {Item = baseType.Item, ItemGroup = baseType.ItemGroup }; }
    【解决方案2】:

    这似乎是generic functions 的一个很好的应用程序......

    public T SimpleTest<T>(BaseClass baseType) where T : BaseClass
    {
        T derivedClass = Activator.CreateInstance<T>();
        derivedClass.item = baseType.item;
        derivedClass.itemGroup = baseType.itemGroup;
        return derivedClass
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多