如何从父实例实例化子实例

本文关键字:实例 实例化 | 更新日期: 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中使所有成员都是公共的。然后,设置所需的属性

我想你是在寻找某种映射器,从一个对象映射到另一个。

你可以使用AutoMapperValueInjecter这样的开源项目,它们可以在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构造函数