从继承类浅拷贝

问题描述:

好吧,所以我有一个名为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(); 

但是我得到了无效的投射。我正在寻找实现这一目标的最佳方法。

+0

它packKitItem是一个KitItem,然后使用MemberwiseClone将仍然返回一个KitItem。 – 2008-11-12 13:43:47

你的问题是,由于ShallowCopy()是KitItem,MemberwiseClone()的成员只是复制KitItem领域并返回即使原来的对象是一个PackageKitItem KitItem。

我认为你必须在这种情况下该怎么做添加到KitItem:

public virtual KitItem ShallowCopy()   
{    
    return (KitItem) this.MemberwiseClone();   
} 

和PackageKitItem:

public override KitItem ShallowCopy()   
{    
    return (PackageKitItem) this.MemberwiseClone();   
} 

因此,你会得到适当的MemberwiseClone()调用来完成取决于您正在尝试的对象ShallowCopy()。

如果您想更进一步,您可以在产品中定义ShallowCopy()(返回产品),然后在KitItem和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; 

}