मेरा जवाब: खराब डिजाइन विकल्प। ;-)
यह एक दिलचस्प बहस है जो सिंटैक्स प्रभाव पर केंद्रित है। मेरे विचार में, तर्क का मूल यह है कि एक डिजाइन निर्णय सील किए गए स्थिर वर्गों का नेतृत्व करता है। बाल नामों के पीछे ('भ्रमित') छिपाने के बजाय शीर्ष स्तर पर दिखने वाले स्थिर वर्ग के नामों की पारदर्शिता पर ध्यान केंद्रित किया गया है? एक भाषा कार्यान्वयन की कल्पना कर सकता है जो आधार या बच्चे को सीधे भ्रमित कर सकता है।
एक छद्म उदाहरण, स्थैतिक विरासत को मानते हुए किसी तरह से परिभाषित किया गया था।
public static class MyStaticBase
{
SomeType AttributeBase;
}
public static class MyStaticChild : MyStaticBase
{
SomeType AttributeChild;
}
इसके लिए नेतृत्व करेंगे:
// ...
DoSomethingTo(MyStaticBase.AttributeBase);
// ...
के रूप में एक ही भंडारण को प्रभावित (जो?) कर सकता है
// ...
DoSomethingTo(MyStaticChild.AttributeBase);
// ...
बहुत ज्यादा उलझन!
लेकिन रुकें! कंपाइलर MyStaticBase और MyStaticChild दोनों में एक ही हस्ताक्षर होने के साथ कैसे निपटेंगे? यदि बच्चा मेरे उपरोक्त उदाहरण से आगे निकल जाता है, तो वही भंडारण नहीं बदलेगा, हो सकता है? इससे और भी भ्रम पैदा होता है।
मेरा मानना है कि सीमित स्थैतिक विरासत के लिए एक मजबूत सूचनात्मक औचित्य है। शीघ्र ही सीमा पर और अधिक। यह छद्मकोड मान दिखाता है:
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
:।
मैं एक संकलक लेखक नहीं हूं, इसलिए मुझे यकीन नहीं है कि मैं एक संकलक में इन सीमाओं को लागू करने की कठिनाइयों के बारे में कुछ याद कर रहा हूं। उस ने कहा, मैं एक मजबूत आस्तिक हूं कि सीमित स्थैतिक विरासत के लिए एक सूचनात्मक स्थान की आवश्यकता है और मूल उत्तर यह है कि आप खराब (या सरल) डिजाइन पसंद के कारण नहीं कर सकते।