2015-08-15 96 views
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 
    } 
} 

回答

0

你将不得不让所有的成员公开内部Foo,将需要从构造函数中设置。然后,设置你需要的属性。

0

为什么你不能通过像下面这样的公共汽车属性来完成它。顺便说一句,你试图有什么是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 
} 

但是当你实例子对象的构造函数初始化将被调用和基类的意志得到第一初始化,为了这不是需要一个无参数的构造函数的原因在子初始化之前已经初始化了基本成员。

如果在基础参数的构造函数和孩子,那么你可以显式调用基类的构造

+0

我使用的是类作为与EF6使用实体和AFAIK EF使用一个类中的属性,形成一个表。 baseinstance将创建一个由主键和外键链接的独立表。 – Qinusty

+0

@Qinusty,如果有帮助,请参阅编辑答案。 – Rahul

0

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

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

这里也是一个很好的文章: Copy values from one object to another

演示与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 
} 
0

只是一个构造函数添加到接受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) 
    { 
    } 
}