如果我需要用现有对象初始化对象的基础,我该怎么办?例如,在这种情况下:
public class A { public string field1; public string field2; } public class B : A { public string field3; public void Assign(A source) { this.base = source; // <-- will not work, what can I do here? } }
Assign()方法显然可以逐字段地为基类赋值,但是没有更好的解决方案吗?由于B类继承自A,因此必须有一种方法可以将A分配给B.base
在C++中,这将是一件微不足道的事情,但我似乎无法掌握如何在.NET中执行此操作
不幸的base
是只读.
[编辑]
好吧也许不那么不幸.基类和子类之间的关系IS-A
不是HAS-A
.通过允许子类更改基类的实例,您允许子类从IS-A
基类开始更改自己的引用.如果您确实需要此功能,那么我建议您更改继承模型以反映您真正想要做的事情.
像这样的东西:
public class A { public string field1; public string field2; } public class B { public string field3; public A a; public void Assign(A source) { this.a = source; } }
似乎更合适,具有更清晰的意义和功能.
public Assign(A a) { foreach (var prop in typeof(A).GetProperties()) { this.GetType().GetProperty(prop.Name).SetValue(this, prop.GetValue(a, null),null); } }
基本上,它使用反射来获取基础的所有属性并将其值分配给A中存在的所有值.
编辑:对于你们所有的反对者,我现在用一个有100个整数变量的基类来快速测试它.然后我在子类中使用了这个assign方法.运行需要46毫秒.我不了解你,但我对此完全没问题.
虽然这里有很多优秀的答案,但我认为正确的方法是链接构造函数:
public class A { public string field1; public string field2; public A(string field1, string2 field2) { this.field1 = field1; this.field2 = field2; } } public class B : A { public string field3; public B(string field1, string2 field2, string field3) : base(field1, field2) { this.field3 = field3; } }