C# 继承类的浅层复制

C# 继承类的浅层复制,c#,inheritance,shallow-copy,C#,Inheritance,Shallow Copy,好的,我有一个抽象基类,叫做Product,一个继承Product的KitItem类和一个继承KitItem的PackageKitItem类。即 Product KitItem : Product PackageKitItem : KitItem 我已经加载了我的KitItems,我需要加载一组PackageKitItems,它们实际上是KitItems的浅拷贝 目前,我们在产品构造器中所做的工作让我感觉像是一个简单的复制品,如下所示: public Product(Product produ

好的,我有一个抽象基类,叫做Product,一个继承Product的KitItem类和一个继承KitItem的PackageKitItem类。即

Product
KitItem : Product
PackageKitItem : KitItem
我已经加载了我的KitItems,我需要加载一组PackageKitItems,它们实际上是KitItems的浅拷贝

目前,我们在产品构造器中所做的工作让我感觉像是一个简单的复制品,如下所示:

public Product(Product product)
        {
            FieldInfo[] fields = product.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

            // copy each value over to 'this'
            foreach (FieldInfo fi in fields)
                fi.SetValue(this, fi.GetValue(product));
        }
我尝试在KitItem上设置副本,如下所示:

public KitItem ShallowCopy()
        {
            return (KitItem)this.MemberwiseClone();
        }
并这样称呼它:

PackageKitItem tempPackKitItem = (PackageKitItem)packKitItem.ShallowCopy();

但我的演员阵容无效。我正在寻找实现这一目标的最佳方法。

在您的产品构造函数中,您已经在进行某种形式的浅层复制,不是吗?如果您没有覆盖构造函数,那么您应该能够创建一个新的PackageKitItem,该PackageKitItem接收一个KitItem作为其参数

PackageKitItem tempPackKitItem = new tempPackKitItem(kitItem);

也许我只是误解了你的问题。

奇怪的是,我在Visual Studio 2008上这样做并没有出错。我张贴代码,以便您可以看到我遗漏了什么或我假设的错误。我猜问题出在你没有发布的一个班级成员身上

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            PackageKitItem PKI = new PackageKitItem();
            PKI.ID      = 1;
            PKI.KitName = "2";
            PKI.Name    = "3";
            PKI.Package = 4;

            PackageKitItem tempPackKitItem = (PackageKitItem)PKI.ShallowCopy();

        }
    }

}

public class Product
{
    public int ID;
    public string Name;

    public Product()
    {
    }

    public Product(Product product)
    {
        FieldInfo[] fields = product.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

        // copy each value over to 'this'
        foreach (FieldInfo fi in fields)
            fi.SetValue(this, fi.GetValue(product));
    }


}

public class KitItem:Product
{
    public string KitName;
    public KitItem ShallowCopy()
    {
        return (KitItem)this.MemberwiseClone();
    }

}

public class PackageKitItem : KitItem
{
    public int Package;

}

问题是,由于ShallowCopy是KitItem的成员,MemberwiseClone只是复制KitItem字段并返回KitItem,即使原始对象是PackageKitItem

我认为,在这种情况下,您必须做的是:

public virtual KitItem ShallowCopy()        
{            
  return (KitItem) this.MemberwiseClone();        
}
以及在PackageKitItem中:

public override KitItem ShallowCopy()        
{            
    return (PackageKitItem) this.MemberwiseClone();        
}
因此,您将根据尝试复制的对象完成正确的MemberwiseClone调用


如果您想更进一步,可以在返回产品的产品中定义浅复制,然后在KitItem和PackageKitItem中覆盖版本,每个版本返回各自的浅复制。

如果packKitItem是KitItem,则使用MemberwiseClone仍将返回KitItem。否,克隆位于KitItem上,我正在尝试初始化packagekititem,这是问题的核心,它不会工作。你不应该将小猫打包为产品,这太残忍了!