使用哪种模式将父类实例中的所有属性复制到子类的实例?

时间:2011-06-18 18:04:03

标签: c#

我强烈地感觉到我所寻找的东西是非常基本的东西,但现在我脑子里还没有什么聪明的东西,所以我在寻求你的帮助。

有一个基类A:

class A 
{
   string Code {get;set;}
}

和一个孩子责备B:

class B : A 
{  
    DateTime ValidFrom {get;set;} 
    DateTime? ValidTo {get;set;} 
}

想象一下,现在有一个A类实例,例如,从Repository加载:

A a = Repository.GetById(1);

获取B实例的最明智的方法是获取当前所有的值(请记住,可能会有更多属性添加到这两个类中)?这种常见模式有名称吗?

感谢您的想法。

5 个答案:

答案 0 :(得分:3)

你真正需要的是向下转换,但不幸的是C#中不允许这样做。

一个简单的解决方案是拥有一个构造函数:

public B (A a){
...
}

答案 1 :(得分:2)

为什么不在B类中调用参数化构造函数

public class B : A 
{  
    DateTime ValidFrom {get;set;} 
    DateTime? ValidTo {get;set;}

    public B(string code)
   {
   base.Code = code;
   } 
}

然后你可以做

A a = Repository.GetById(1);
B b = new B(a.Code);

答案 2 :(得分:2)

如果您不想更改类的构造,可以为您的类提供复制机制:

class A
{
    public string Code { get; set; }

    public virtual void Copy(A other)
    {
        this.Code = other.Code;
    }
}

class B : A
{
    DateTime Start { get; set; }
    DateTime? End { get; set; }

    public override virtual void Copy(B other)
    {
        base.Copy(other);

        this.Start = other.Start;
        this.End = other.End;
    }
}

然后使用这样的东西:

        A a = new A();
        a.Code = "XXX";
        B b = new B();
        b.Copy(a);
        b.Start = DateTime.Now;
        B b2 = new B();
        b2.Copy(b);

答案 3 :(得分:1)

其他框架或库或编程语言具有对象层次结构,其中对象的实例可以将其字段和属性的值复制到其他对象,而不是完全相同的类对象。因为,它具有复制字段或属性的特定方法。

public class classRoot
{
  public string Name { get; set; }

  public virtual void assignFrom(myRootClass objSource)
  {
     if (objSource != null) {
       this.Name = objSource.Name;
     }
  }

  public virtual void assignTo(ref myRootClass objDest)
  {
     if (objDest != null) {
       objDest.Name = this.Name;
     }
  }
}

public class classFoo: classRoot
{
  public Color Color { get; set; }

  public override void assignFrom(myRootClass objSource) { updateChanges(); }
  public override void assignTo(ref myRootClass objDest) { updateChanges(); }
}

public class classBar: classRoot
{
  public int Age { get; set; }

  public override void assignFrom(myRootClass objSource) { updateChanges(); }
  public override void assignTo(ref myRootClass objDest) { updateChanges(); }
}

public class classDemo
{
  public void anyMethod()
  {
    classFoo objFoo = new classFoo("Foo1");
    classFoo objBar = new classBar("Bar2");

    MessageBox.Show("Name: " + objFoo);
    objBar.AssignTo(ref objFoo);
    MessageBox.Show("Name: " + objFoo);
  }
}

不要混淆这个概念,使make成为“clone()”,或者制作“deepCopy()”或制作“shallowCopy()”,在某些情况下,使用此函数可以解决这个问题。

当您想要创建具有相同类的新对象时,这些函数会有所帮助,并且您希望将数据从现有对象复制到另一个现有对象,其中类是相关的,但可能不完全相同。 / p>

答案 4 :(得分:0)

看起来我们有另一个解决方案

参考:https://stackoverflow.com/a/14965280/371610

 public class Parent
{
    public string Name { get; set; }
    public string City { get; set; }

    //normal constructor
    public Parent()
    {

    }

    protected Parent(Parent copy)
    {
        this.Name = copy.Name;
        this.City = copy.City;
    }
}

儿童班

public class Child : Parent
{
    public string NewInfo { get; set; }

    public Child(Parent copy)
        : base(copy)
    {

    }
}