我想这对大多数人来说都是一个简单的问题,但我在网上看到的答案都不是我需要的。所以,我有一个基类和另一个继承它的基类:
public class MyBase
{
public DateAdded { get; set; }
}
public class MySecond : MyBase
{
public MySecond(MyBase prototype)
{
this = (MySecond)prototype; // this is read-only and does not work
}
public DateDeleted { get; set; }
}
如何实现MyBase,将其作为原型提供给另一个MySecond实例,并确保后者获取原型的所有值,而不是逐个明确地传递值?
答案 0 :(得分:9)
正如dasblinkenlight所述,让每个类负责复制自己的属性可能更合适,除非这不是总是合适的。
请注意,您可能需要检查prototype
本身是MySecond
的实例,如果是,请复制该属性。
另请注意,如果使用组合而不是继承,并尝试使类不可变,很多时候这种事情变得不必要或微不足道。它并不总是合适的,但我看到很多过度使用继承。
答案 1 :(得分:7)
您无法自动执行复制,但您可以在共享位置执行此操作 - 即在MyBase
类的构造函数中执行此操作。这样,如果您将prototype
作为基础构造函数的参数传递,则所有派生类都可以使用相同的共享代码,如下所示:
public class MyBase {
public DateAdded { get; set; }
public MyBase() {
}
public MyBase(MyBase other) {
// Do the copying here
}
}
public class MySecond : MyBase {
public MySecond(MyBase prototype) : base(prototype) {
}
public DateDeleted { get; set; }
}
编辑(回复评论)
如果您无权访问MyBase
的来源,您可以制作一个静态帮助方法,为您进行复制,如下所示:
internal static class MyBaseHelper {
public static void CopyFromBase(this MyBase target, MyBase source) {
target.DateAdded = source.DateAdded;
}
}
现在您可以在派生类中使用它,如下所示:
public class MySecond : MyBase {
public MySecond(MyBase prototype) {
this.CopyFromBase(prototype);
}
public DateDeleted { get; set; }
}