سؤال

هل لك أن تشرح لي لماذا يجب أن ترث من ICloneable وتنفيذ طريقة Clone()؟

إذا أريد القيام به نسخة عميق، لا يمكنني فقط تنفيذ الأسلوب الخاص بي؟ دعونا نقول MyClone()؟

وماذا يجب أن ترث من ICloneable؟ ماهي المزايا؟ هل هو مجرد مسألة اتخاذ كود "أكثر قابلية للقراءة"؟

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

المحلول

وأنت لا ينبغي. توصي Microsoft ضد تنفيذ ICloneable لأنه ليس هناك إشارة واضحة من واجهة ما إذا كانت طريقة Clone الخاص بإجراء "العميق" أو "ضحل" استنساخ.

هذا بلوق وظيفة من براد ابرامز الظهر في عام 2003 (!) لمزيد من المعلومات.

نصائح أخرى

واجهة ICloneable <ط> في حد ذاته ليست مفيدة للغاية، وهو ما يعني أن هناك ليست حقا كثير من الحالات حيث انه من المفيد أن نعرف أن الهدف من ذلك هو cloneable دون معرفة أي شيء آخر عن ذلك. هذا هو الوضع مختلفا جدا من مثل IEnumerable أو IDisposable. هناك العديد من الحالات حيث انها مفيدة لقبول IEnumerable دون معرفة أي شيء آخر سوى كيفية تعداد ذلك.

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

وبمجرد أن تم انجازه، والطريقة التي يريد أن يقبل كائن من نوع WonderfulBase، وتحتاج إلى أن تكون قادرة على استنساخ ذلك، يمكن أن تكون مشفرة لقبول كائن WonderfulBase التي تدعم الاستنساخ (باستخدام معلمة نوع عام مع base- نوع والقيود ICloneable). على الرغم من أن واجهة ICloneable لن نفسها تشير إلى استنساخ عميق أو ضحل، فإن وثائق WonderfulBase تشير إلى ما إذا WonderfulBase cloneable ينبغي أن يكون في أعماق ضحلة أو-المستنسخة. في الأساس، فإن واجهة ICloneable لن تحقق أي شيء لن يتحقق من خلال تحديد ICloneableWonderfulBase، إلا أنه تجنب الحاجة إلى تعريف أسماء مختلفة لكل فئة أساسية مختلفة cloneable.

وICloneable هي واحدة من تلك القطع الأثرية في BCL التي كانت مثيرة للجدل. لا يوجد سبب حقيقي IMHO لتنفيذه. وقال مع ذلك إذا وانا ذاهب الى إنشاء أسلوب استنساخ ثم أفعل تنفيذ ICloneable، وأوفر بلدي نسخة مطبوعة قوي Clone.

ويتم ذلك أبدا أشار المسألة مع ICloneable إذا كان Clone ضحلة أو نسخة العميقة التي هي أشياء مختلفة جدا. والحقيقة أنه لا يوجد ICloneable<T> قد يكون مؤشرا على الأفكار مايكروسوفت عن ICloneable

ومات هو الصحيح، لا يستخدمونه. إنشاء أسلوب خاص بك Copy() (أو اسم مشابه) وجعلها <م> اضحة تماما في API العام الخاص بك سواء طريقتك هو خلق نسخة عميقة أو ضحلة من وجوه الخاص بك.

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