विशिष्ट समस्या पैटर्न क्या हैं जो कई विरासतों के भारी उपयोग करने के लिए डिज़ाइन किए गए कोड से लाभ उठाते हैं?
यह सिर्फ एक उदाहरण है, लेकिन एक मैं फोन करने वालों या उपवर्गों में कैस्केडिंग परिवर्तन लागू करने के लिए सुरक्षा में सुधार करने और प्रलोभन को कम करने के लिए अमूल्य पाता हूं।
जहां मुझे कई विरासत मिली हैं, जो सबसे अमूर्त के लिए भी अविश्वसनीय रूप से उपयोगी है, सी + + में नॉन-वर्चुअल इंटरफ़ेस मुहावरा (एनवीआई) है।
वे नहीं कर रहे हैं यहां तक कि वास्तव में सार आधार वर्ग इतना के रूप में इंटरफेस , उन्हें कार्यान्वयन उनके अनुबंध के सार्वभौमिक पहलुओं को लागू करने का सिर्फ एक छोटा सा है कि के रूप में वे वास्तव में इतना अनुबंध की व्यापकता को सीमित नहीं कर रहे हैं के रूप में बेहतर इसे लागू ।
सरल उदाहरण (कुछ की जाँच हो सकती है कि पास किया गया फ़ाइल हैंडल खुला है या ऐसा कुछ है):
// Non-virtual interface (public methods are nonvirtual/final).
// Since these are modeling the concept of "interface", not ABC,
// multiple will often be inherited ("implemented") by a subclass.
class SomeInterface
{
public:
// Pre: x should always be greater than or equal to zero.
void f(int x) /*final*/
{
// Make sure x is actually greater than or equal to zero
// to meet the necessary pre-conditions of this function.
assert(x >= 0);
// Call the overridden function in the subtype.
f_impl(x);
}
protected:
// Overridden by a boatload of subtypes which implement
// this non-virtual interface.
virtual void f_impl(int x) = 0;
};
इस मामले में, शायद f
एक हजार स्थानों द्वारा कोडबेस में बुलाया जाता है, जबकि f_impl
सौ उपवर्गों द्वारा ओवरराइड किया जाता है।
उन सभी 1000 स्थानों पर इस तरह की सुरक्षा जांच करना मुश्किल होगा जो कॉल f
या ओवरराइड करने वाले सभी 100 स्थानों पर करते हैं f_impl
।
केवल इस प्रविष्टि को कार्यक्षमता के लिए गैर-संवैधानिक बनाकर, यह मुझे इस जाँच को करने के लिए एक केंद्रीय स्थान देता है। और यह जांच थोड़ी सी भी कमी को कम नहीं कर रही है, क्योंकि यह केवल इस फ़ंक्शन को कॉल करने के लिए आवश्यक एक पूर्व शर्त है। एक अर्थ में, यह यकीनन इंटरफ़ेस द्वारा प्रदान किए गए अनुबंध को मजबूत कर रहा है, और x
यह सुनिश्चित करने के लिए इनपुट की जांच के बोझ से राहत देता है कि यह सभी 100 स्थानों पर वैध पूर्व शर्त के अनुरूप है जो इसे ओवरराइड करते हैं।
यह कुछ ऐसा है जो मैं चाहता हूं कि हर भाषा हो, और सी ++ में भी कामना हो, कि यह एक देशी अवधारणा से थोड़ा अधिक था (उदाहरण: हमें ओवरराइड करने के लिए एक अलग फ़ंक्शन को परिभाषित करने की आवश्यकता नहीं है)।
यह बेहद उपयोगी है यदि आपने पहले से ऐसा नहीं किया है assert
, और आपको एहसास हुआ कि आपको बाद में इसकी आवश्यकता है जब कोडबेस के कुछ यादृच्छिक स्थानों पर नकारात्मक मानों का सामना किया जा रहा था f
।