【问题标题】:how to instantiate child instance from parent instance如何从父实例实例化子实例
【发布时间】:2015-08-15 22:11:30
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: c# inheritance


    【解决方案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)
        {
        }
    }
    

    【讨论】:

      【解决方案2】:

      您必须在 Foo 中公开您的所有成员,这需要从构造函数中设置。然后,设置您需要的属性。

      【讨论】:

        【解决方案3】:

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

        您可以使用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
        }
        

        【讨论】:

          【解决方案4】:

          您为什么不能通过如下所示的公共汽车属性来完成它。顺便说一句,您想要的是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
          }
          

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

          如果你在基类和子类中都有参数化构造函数,那么你可以显式调用基类构造函数

          【讨论】:

          • 我将该类用作与 EF6 一起使用的实体,而 afaik EF 使用类中的属性来形成一个表。基本实例将创建一个由主键和外键链接的单独表。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          • 2021-08-28
          • 1970-01-01
          • 2021-11-07
          • 1970-01-01
          相关资源
          最近更新 更多