سؤال

وطيب حتى لدي فئة قاعدة مجردة تسمى المنتج، فئة KitItem أن يرث المنتج وفئة PackageKitItem أن يرث KitItem. أي.

Product
KitItem : Product
PackageKitItem : KitItem

ولدي KitItems تحميل ولست بحاجة لتحميل مجموعة من PackageKitItems التي هي، على نحو فعال، ونسخا الضحلة KitItems.

وحاليا نقوم به ما يشعر لي نسخة الضحلة hacky في منشئ المنتج مثل ذلك:

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

ولكن يمكنني الحصول يلقي صالح. أنا أبحث عن الأفكار عن أفضل وسيلة لتحقيق ذلك.

هل كانت مفيدة؟

المحلول

والمشكلة لديك هي أنه منذ ShallowCopy () هو عضو في KitItem، MemberwiseClone () هو مجرد نسخ الحقول KitItem وإرجاع KitItem حتى إذا كان الكائن الأصلي هو PackageKitItem.

وأعتقد أن ما عليك القيام به في هذا الظرف إضافة إلى KitItem:

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

ووفي PackageKitItem:

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

وهكذا سوف تحصل على دعوة MemberwiseClone الصحيح () القيام به اعتمادا على الكائن الذي تحاول ShallowCopy ().

إذا كنت تريد أن تذهب أبعد من ذلك، هل يمكن تحديد ShallowCopy () في المنتج (إرجاع المنتج) ثم قد تجاوز الإصدارات في KitItem وPackageKitItem كل عودته نسخة الضحلة لكل منهما.

نصائح أخرى

والغريب أنني لم تحصل على خطأ القيام بذلك على البصرية ستوديو 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;

}

في منشئ المنتج الخاص بك تقومون به بالفعل شكلا من أشكال نسخة الضحلة، ليست لك؟ إذا لم تكن الكتابة منشئ الخاص بك، ثم يجب أن تكون قادرة على مجرد خلق PackageKitItem الجديدة التي تتلقى KitItem كمعلمة به.

PackageKitItem tempPackKitItem = new tempPackKitItem(kitItem);

وربما أنا فقط يساء فهمها سؤالك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top