আপনি থেকে প্রাপ্ত করা উচিত নয় ICloneable।
কারণটি হ'ল যখন মাইক্রোসফ্ট। নেট ফ্রেমওয়ার্কটি ডিজাইন করেছিল তারা কখনই নির্দিষ্ট করে নিল যে Clone()পদ্ধতিটি ICloneableগভীর বা অগভীর ক্লোন হওয়া উচিত, সুতরাং ইন্টারফেসটি শব্দার্থবিধভাবে ভেঙে যায় কারণ আপনার কলকারীরা জানতে পারবেন না যে কলটি গভীরভাবে বা অগভীর ক্লোনটি অজানা করবে কিনা।
পরিবর্তে, আপনার (এবং ) পদ্ধতিগুলির সাথে আপনার নিজের IDeepCloneable(এবং IShallowCloneable) ইন্টারফেসগুলি সংজ্ঞায়িত করা উচিত ।DeepClone()ShallowClone()
আপনি দুটি ইন্টারফেস সংজ্ঞায়িত করতে পারেন, একটি জেনেরিক প্যারামিটার সহ দৃ strongly়ভাবে টাইপযুক্ত ক্লোনিং সমর্থন করার জন্য এবং একটি যখন আপনি বিভিন্ন ধরণের ক্লোনযোগ্য বস্তুর সংগ্রহ নিয়ে কাজ করছেন তখন দুর্বলভাবে টাইপযুক্ত ক্লোনিং ক্ষমতা না রেখে:
public interface IDeepCloneable
{
object DeepClone();
}
public interface IDeepCloneable<T> : IDeepCloneable
{
T DeepClone();
}
যা আপনি এর পরে প্রয়োগ করবেন:
public class SampleClass : IDeepCloneable<SampleClass>
{
public SampleClass DeepClone()
{
// Deep clone your object
return ...;
}
object IDeepCloneable.DeepClone()
{
return this.DeepClone();
}
}
সাধারণত আমি বর্ণিত ইন্টারফেসগুলি কোনও অনুলিপি নির্মাণকারীর বিপরীতে ব্যবহার করতে পছন্দ করি যা উদ্দেশ্য খুব পরিষ্কার রাখে। একটি অনুলিপি নির্মাণকারী সম্ভবত একটি গভীর ক্লোন হিসাবে ধরে নেওয়া হবে, তবে এটি অবশ্যই কোনও আইডিপ্লাইকনেবল ইন্টারফেস ব্যবহার করার মতো পরিষ্কার অভিপ্রায় হিসাবে বেশি নয়।
এটি নেট ফ্রেমওয়ার্ক ডিজাইন গাইডলাইন এবং ব্র্যাড আব্রামসের ব্লগে আলোচনা করা হয়েছে
(আমি মনে করি আপনি যদি কোনও অ্যাপ্লিকেশন লিখছেন (কোনও ফ্রেমওয়ার্ক / লাইব্রেরির বিপরীতে) যাতে আপনি নিশ্চিত হয়ে যেতে পারেন যে আপনার দলের বাইরে কেউ আপনার কোড কল করছে না, এটি এতটা গুরুত্বপূর্ণ নয় এবং আপনি এর অর্থসূচক অর্থ নির্ধারণ করতে পারেন । নেট আইসিএলনেবল ইন্টারফেসের "ডিপক্লোন", তবে আপনার এটি নিশ্চিত করা উচিত যে এটি আপনার দলটির মধ্যে ভালভাবে নথিভুক্ত এবং ভালভাবে বোঝা গেছে Pers ব্যক্তিগতভাবে আমি কাঠামোর নির্দেশিকাগুলিতে আঁকড়ে থাকি))