使用哪个模式将所有属性从父类的实例复制到子类的实例

本文关键字:实例 父类 复制 子类 属性 模式 | 更新日期: 2023-09-27 17:59:37

我强烈觉得我想要的是一些非常基本的东西,但我现在没有想到什么聪明的东西,所以我请求你的帮助。

有一个基本类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);

对于获得一个派生出a当前所有值的B实例,最明智的方法是什么(请记住,可能会有更多的属性添加到这两个类中)?这种常见模式有名字吗?

谢谢你的想法。

使用哪个模式将所有属性从父类的实例复制到子类的实例

您真正需要的是下转换,但不幸的是,这在C#中是不允许的。

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

public B (A a){
...
}

为什么不在类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);

如果你不想改变类的构造,你可以为你的类提供一个复制机制:

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);

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

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 a"clone()"、make a"deepCopy()"或make"shallowCopy()"混淆,在某些情况下应该用这个函数来解决。

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

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

参考编号: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)
    {
    }
}