আমার উত্তর: নকশার পছন্দ কম। ;-)
সিনট্যাক্স এফেক্টের উপর দৃষ্টি নিবদ্ধ করা এটি একটি আকর্ষণীয় বিতর্ক। আমার দৃষ্টিতে তর্কটির মূলটি হ'ল একটি ডিজাইনের সিদ্ধান্তের ফলে সিল স্ট্যাটিক ক্লাস হয়। স্থিত শ্রেণীর নাম স্বচ্ছতার উপর দৃষ্টি নিবদ্ধ করে শিশুদের নামের পিছনে ('বিভ্রান্তিকর') লুকানোর পরিবর্তে শীর্ষ স্তরে উপস্থিত হয়? যে কোনও ভাষা প্রয়োগের চিত্র তৈরি করতে পারে যা বিভ্রান্তিকর, বেস বা শিশুটিকে সরাসরি অ্যাক্সেস করতে পারে।
একটি ছদ্ম উদাহরণ, স্থির উত্তরাধিকারকে একরকমভাবে সংজ্ঞায়িত করা হয়েছে।
public static class MyStaticBase
{
SomeType AttributeBase;
}
public static class MyStaticChild : MyStaticBase
{
SomeType AttributeChild;
}
বাড়ে:
// ...
DoSomethingTo(MyStaticBase.AttributeBase);
// ...
যা (যেমন?) একই স্টোরেজকে প্রভাবিত করতে পারে
// ...
DoSomethingTo(MyStaticChild.AttributeBase);
// ...
খুবই বিভ্রান্তিকর!
কিন্তু অপেক্ষা করো! মাইস্ট্যাটিকবেস এবং মাইস্ট্যাটিকচিল্ড উভয়ের মধ্যে একই স্বাক্ষর সংজ্ঞায়িত হওয়ার সাথে সংকলক কীভাবে ডিল করবেন? যদি শিশু আমার উপরের উদাহরণের চেয়ে ওভাররাইড করে তবে একই স্টোরেজটি বদলাবে না, সম্ভবত? এটি আরও বিভ্রান্তির দিকে নিয়ে যায়।
আমি বিশ্বাস করি সীমিত স্থিতিশীল উত্তরাধিকারের জন্য একটি শক্তিশালী তথ্য স্থানের ন্যায়সঙ্গততা রয়েছে। শীঘ্রই সীমা আরও। এই সিউডোকোডটি মানটি দেখায়:
public static class MyStaticBase<T>
{
public static T Payload;
public static void Load(StorageSpecs);
public static void Save(StorageSpecs);
public static SomeType AttributeBase
public static SomeType MethodBase(){/*...*/};
}
তারপরে আপনি পাবেন:
public static class MyStaticChild : MyStaticBase<MyChildPlayloadType>
{
public static SomeType AttributeChild;
public static SomeType SomeChildMethod(){/*...*/};
// No need to create the PlayLoad, Load(), and Save().
// You, 'should' be prevented from creating them, more on this in a sec...
}
ব্যবহারের মতো দেখাচ্ছে:
// ...
MyStaticChild.Load(FileNamePath);
MyStaticChild.Save(FileNamePath);
doSomeThing(MyStaticChild.Payload.Attribute);
doSomething(MyStaticChild.AttributeBase);
doSomeThing(MyStaticChild.AttributeChild);
// ...
স্থির বাচ্চা তৈরি করা ব্যক্তির যতক্ষণ না তারা প্ল্যাটফর্মের বা পরিবেশের সিরিয়ালাইজেশন ইঞ্জিনে রাখা যেতে পারে এমন কোনও সীমাবদ্ধতা বুঝতে পারে ততক্ষণ সিরিয়ালাইজেশন প্রক্রিয়া সম্পর্কে চিন্তা করার প্রয়োজন নেই।
পরিসংখ্যান (সিলেটলেটস এবং 'গ্লোবালগুলি'র অন্যান্য রূপ) প্রায়শই কনফিগারেশন স্টোরেজের আশেপাশে আসে। স্থিতিশীল উত্তরাধিকার এই ধরণের দায়িত্ব বরাদ্দকে কনফিগারেশনের একটি শ্রেণিবিন্যাসের সাথে মেলে ধরে সিনট্যাক্সে পরিষ্কারভাবে উপস্থাপন করার অনুমতি দেয়। যদিও আমি যেমন দেখিয়েছি যে, বেসিক স্ট্যাটিক উত্তরাধিকারের ধারণাগুলি বাস্তবায়িত হলে ব্যাপক অস্পষ্টতার সম্ভাবনা রয়েছে।
আমি বিশ্বাস করি যে সঠিক নকশার পছন্দটি নির্দিষ্ট সীমাবদ্ধতার সাথে স্থির উত্তরাধিকারকে মঞ্জুর করা হবে:
- কোনও কিছুর ওভাররাইড নেই। শিশুটি বেস বৈশিষ্ট্য, ক্ষেত্র বা পদ্ধতিগুলি প্রতিস্থাপন করতে পারে না ... ... ওভারলোডিং ঠিক হওয়া উচিত, যতক্ষণ না স্বাক্ষরকারীর মধ্যে পার্থক্য থাকে কম্পাইলারকে শিশু বনাম বেস বাছাই করতে দেয়।
- কেবল জেনেরিক স্ট্যাটিক বেসগুলিকে অনুমতি দিন, আপনি অ-জেনেরিক স্ট্যাটিক বেস থেকে উত্তরাধিকারী হতে পারবেন না।
আপনি এখনও জেনেরিক রেফারেন্সের মাধ্যমে একই স্টোরটি পরিবর্তন করতে পারেন MyStaticBase<ChildPayload>.SomeBaseField
। জেনেরিক প্রকারটি নির্দিষ্ট করতে হবে বলে আপনি নিরুৎসাহিত হবেন। শিশু রেফারেন্স ক্লিনার হবে যদিও: MyStaticChild.SomeBaseField
।
আমি কোনও সংকলক লেখক নই তাই কোনও সংকলকটিতে এই সীমাবদ্ধতাগুলি বাস্তবায়নের অসুবিধা সম্পর্কে আমি কিছু মিস করছি কিনা তা সম্পর্কে আমি নিশ্চিত নই। এটি বলেছিল, আমি দৃ strong় বিশ্বাসী যে সীমিত স্থিতিশীল উত্তরাধিকারের জন্য একটি তথ্যের জায়গার প্রয়োজন আছে এবং এর প্রাথমিক উত্তরটি হ'ল আপনি কোনও দরিদ্র (বা সাধারণেরও বেশি) নকশা পছন্দ করার কারণে পারবেন না।