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

4
我希望能够使用父类实例化子类,并设置所有继承变量。
例如:
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
    }
}
4个回答

1

只需在父类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)
    {
    }
}

0

你需要在Foo内将所有成员设置为公共的,并且需要从构造函数中进行设置。然后,设置你所需的属性。


0
为什么你不能通过下面的公共自动属性完成它呢?顺便说一句,你想要的是“组合”,其中“bar”对象由“foo”对象组成。不确定为什么你还在从“foo”继承?
public class bar : Foo
{
    public int ID { get; set; }
    public Foo baseinstance { get; set;} 

    public bar(Foo instance)
    {
        baseinstance = instance; 
    }
}

我不是完全确定,但从您发布的代码(特别是下面的部分)来看,感觉您正在尝试调用基类构造函数或构造函数初始化程序,因为您说:

我希望使用父实例来实例化子类,以设置所有继承变量。

public bar(Foo instance)
{
    base = instance; 
}

实际上应该是这样的

public bar(Foo instance) : base()
{
   //child instance initialization
}

但这不是无参构造函数所必需的,因为当您实例化子对象构造函数初始化程序将被调用,并且基类将首先被初始化,以便在子初始化之前初始化基成员。

如果您在基类和子类中有参数化构造函数,则可以显式调用基础构造函数


我正在使用该类作为与EF6一起使用的实体,据我所知,EF使用类中的属性来形成表。基础实例将创建一个由主键和外键链接的单独表。 - Qinusty

0

我认为你正在寻找一种将一个对象映射到另一个对象的映射器。

你可以使用像 AutoMapperValueInjecter 这样的开源项目,它们可以在 NuGet 上找到。

这里还有一篇不错的文章: 从一个对象复制值到另一个对象

使用 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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接