如何从父实例实例化子实例
本文关键字:实例 实例化 | 更新日期: 2023-09-27 18:08:11
我正在寻找一个使用父实例实例化的子类来设置所有继承的变量。
例如:public class Foo
{
//Variables
}
public class bar : Foo
{
public int ID { get; set; }
public bar(Foo instance)
{
base = instance; // Doesn't work but is generally the idea I'm looking for
}
}
只需在父Foo
类中添加一个构造函数,该构造函数接受Foo
实例并负责复制字段。然后Bar
类可以调用它作为基构造函数。
public class Foo
{
private string var1;
private string var2;
public Foo() { }
public Foo(Foo otherFoo)
{
this.var1 = otherFoo.var1;
this.var2 = otherFoo.var2;
}
}
public class Bar : Foo
{
public int ID { get; set; }
public Bar(Foo instance)
: base(instance)
{
}
}
您必须在需要从构造函数设置的Foo
中使所有成员都是公共的。然后,设置所需的属性
我想你是在寻找某种映射器,从一个对象映射到另一个。
你可以使用AutoMapper
或ValueInjecter
这样的开源项目,它们可以在NuGet
上找到。
这里也有一篇很好的文章:将值从一个对象复制到另一个对象
Demo with ValueInjecter
:
static void Main(string[] args)
{
var foo = new Foo()
{
Property1 = "Value1",
Property2 = "Value2"
};
var bar = Mapper.Map<Bar>(foo);
bar.Id = 3;
Console.WriteLine(bar.Id); //3
Console.WriteLine(bar.Property1); //Value1
Console.WriteLine(bar.Property2); //Value2
}
为什么不能像下面这样通过公共auto属性来完成呢?顺便说一句,你想要的是Composition
,其中bar
对象由foo
对象组成。不知道为什么你仍然继承foo
?
public class bar : Foo
{
public int ID { get; set; }
public Foo baseinstance { get; set;}
public bar(Foo instance)
{
baseinstance = instance;
}
}
我不是绝对确定,但从你发布的代码(特别是下面的部分),感觉就像你试图调用基类构造函数或constructor initializer
,因为你说
我正在寻找一个使用父实例实例化的子类设置所有继承的变量。
public bar(Foo instance)
{
base = instance;
}
实际上应该是
public bar(Foo instance) : base()
{
//child instance initialization
}
但是对于无参数构造函数来说,这是不需要的,因为当你实例化子对象时,构造函数初始化器将被调用,基类将首先初始化,以便在子对象初始化之前初始化基类成员。
如果在base和child中都有参数化构造函数,则可以显式调用base构造函数