可维护的转换
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 中进行更改。
它仍然有点难看,如果可能的话我会避免它——但这取决于上下文。 (有时使用组合而不是继承是前进的方向,但这肯定不是普遍适用的。)
我有一个 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 中进行更改。
它仍然有点难看,如果可能的话我会避免它——但这取决于上下文。 (有时使用组合而不是继承是前进的方向,但这肯定不是普遍适用的。)