可维护的转换

Maintainable Conversions

我有一个 class 继承自基础 class;它几乎完全一样,不同之处在于一个 TypeParam 来帮助智能感知。我想提供一种将现有父 class 转换为子 class.

的方法

我目前是这样做的:

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

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

有没有更好的方法来完成这个?

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

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?
}

这样,复制发生在声明字段的 class 中。最好知道如何处理这些字段;它绝对可以 访问 字段,即使它们是私有的;当引入新字段时,您只需在相同的 class 而不是派生的 class 中进行更改。

它仍然有点难看,如果可能的话我会避免它——但这取决于上下文。 (有时使用组合而不是继承是前进的方向,但这肯定不是普遍适用的。)