可维护的转换

时间:2015-04-01 15:30:35

标签: c# inheritance

我有一个继承自基类的类;它几乎完全相同,不同的是TypeParam来帮助智能感知。我想提供一种将现有父类转换为子类的方法。

我目前正在这样做:

class A
{
   public int f1;
   public int f2;
}

class B<T> : A
{
   public static B<T> Create(A a)
   {
       return new B<T>
       {
           f1 = a.f1;
           f2 = a.f2;
       };
   }
}

我担心的是,这不是一个非常易维护的解决方案,并且如果添加了新字段或属性但在create方法中被遗忘,可能会导致问题。我也想避免反射只是复制一个对象。

有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:3)

典型的方法是在层次结构中的每个类中提供复制构造函数。例如:

class A
{
    private int f1;
    private int f2;

    public A()
    {
       ...
    }

    public A(A original)
    {
        f1 = original.f1;
        f2 = original.f2;
    }
}

class B<T> : A
{
    public B(A original) : base(original)
    {
    }

    // Possibly overload with a B(B<T> original) as well?
}

这样复制发生在声明字段的类中。最好知道如何处理这些领域;即使他们是私人的,它肯定会访问到这些字段;当引入新字段时,您只需要在同一个类而不是派生类中进行更改。

它仍然有些难看,如果可能的话我会避免它 - 但这取决于背景。 (有时使用构图而不是继承是前进的方式,但这当然不是普遍适用的。)