لماذا يجب أن تنفذ ICloneable في ج #؟
-
22-08-2019 - |
سؤال
هل لك أن تشرح لي لماذا يجب أن ترث من 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 العام الخاص بك سواء طريقتك هو خلق نسخة عميقة أو ضحلة من وجوه الخاص بك.