2008-11-12 4 views
2

좋아, Product라는 상속 클래스의 KitItem 클래스와 KitItem을 상속받은 PackageKitItem 클래스라는 추상 기본 클래스가 있습니다. 즉.Shape Copy 상속받은 클래스들

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을 반환합니다. –

+0

아니요, 복제품이 KitItem에 있습니다. packagekititem을 초기화하려고하는데 문제의 핵심은 작동하지 않습니다. – Echostorm

+2

당신은 제품으로 새끼 고양이를 꾸려서는 안됩니다. 잔인합니다! –

답변

4

당신이 가진 문제는 ShallowCopy()가 KitItem, MemberwiseClone()의 회원이기 때문에 단지 KitItem 필드를 복사하고 원본 객체가 PackageKitItem 경우에도 KitItem를 반환하는 것입니다. 에 따라 수행 호출)

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

따라서 당신이 (적절한 MemberwiseClone를 얻을 것이다 :

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

및 PackageKitItem에서을 :

나는이 상황에서해야 할 KitItem에 추가 어떻게 생각 ShallowCopy()를 시도하는 개체.

더 자세히 알고 싶다면 제품에서 ShallowCopy()를 정의한 다음 (제품을 반환) KitItem 및 PackageKitItem에서 각각의 얕은 복사본을 반환하는 재정의 된 버전을 가질 수 있습니다.

0

Product 생성자에서 이미 얕은 복사본의 일부 형식을 수행하고 있습니까? 생성자를 겹쳐 쓰지 않았다면, 매개 변수로 KitItem을받는 새로운 PackageKitItem을 생성 할 수 있어야합니다.

PackageKitItem tempPackKitItem = new tempPackKitItem(kitItem); 

은 어쩌면 내가 당신의 질문을 오해.

1

이상하게도 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; 

}