आम OO राय यह है कि एक अंतरफलक एक भी अनुबंध को परिभाषित करता है कि वे किस तरह की वस्तुओं है कि इंटरफेस के अनुरूप उपयोग किया जाता है और कैसे व्यवहार स्थापित करता है। NVI मुहावरा या पैटर्न, मुझे पता है कभी नहीं जब एक, अन्य हो जाता है दो अलग-अलग अनुबंध में इंटरफ़ेस विभाजित करके कि मानसिकता में बदलाव का प्रस्ताव:
- कैसे इंटरफ़ेस
- क्या पाने कक्षाएं प्रयोग की जाने वाली चाहिए की पेशकश
इस सेल्सियस के लिए विशेष रूप से कुछ अर्थों में ++ है, जहां इंटरफ़ेस वास्तव में कोड शामिल कर सकते हैं कि --how उपयोगकर्ताओं को देखने बाहरी इंटरफ़ेस me-- से adapts (एकाधिक विरासत के साथ किसी भी भाषा के लिए वास्तव में) और आंतरिक इंटरफेस - मैं कैसे लागू किया गया है।
यह विभिन्न मामलों में उपयोगी हो सकता है, पहला जब व्यवहार आम होता है लेकिन एक सामान्य एल्गोरिदम कंकाल के साथ केवल विशिष्ट तरीकों से पैरामीट्रिज्ड किया जा सकता है। फिर एल्गोरिदम बेस क्लास और व्युत्पन्न तत्वों में एक्सटेंशन पॉइंट्स में कार्यान्वित किया जा सकता है। एकाधिक विरासत के बिना भाषाओं में इसे एक वर्ग में विभाजित करके लागू किया जाना चाहिए जो कुछ पैरामीटर में आधारित एल्गोरिदम लागू करता है जो एक अलग 'निजी' इंटरफ़ेस का अनुपालन करता है। मैं इस अर्थ में 'निजी' का उपयोग कर रहा हूं कि केवल आपकी कक्षा उस इंटरफ़ेस का उपयोग करेगी।
दूसरा आम उपयोग कि NVI मुहावरा का उपयोग करके, यह आसान साधन के लिए एक ही आधार स्तर पर संशोधित करके कोड है:
class Base {
public:
void foo() {
foo_impl();
}
private:
virtual void foo_impl() = 0;
};
डिस्पैचर foo() { foo_impl(); }
लिखने के लिए होने के अतिरिक्त लागत के बजाय है छोटे और यह आपको लॉकिंग तंत्र को बाद में जोड़ने की अनुमति देता है यदि आप कोड को मल्टीथ्रेड किए गए एप्लिकेशन में परिवर्तित करते हैं, प्रत्येक कॉल में लॉगिंग जोड़ते हैं, या टाइमर को यह सत्यापित करने के लिए कि प्रत्येक फ़ंक्शन में कितने अलग कार्यान्वयन होते हैं ... चूंकि वास्तविक विधि लागू की गई है व्युत्पन्न कक्षाओं में इस स्तर पर निजी है, आपको गारंटी है कि सभी पॉलीमोर्फिक कॉलों को एक बिंदु पर वाद्य यंत्रित किया जा सकता है: आधार (यह कक्षाओं को विस्तारित नहीं करता है foo_impl
बनाने सार्वजनिक सोचा)
void Base::foo() {
scoped_log log("calling foo"); // we can add traces
lock l(mutex); // thread safety
foo_impl();
}
तो आभासी तरीकों सार्वजनिक थे, तो आप तरीकों के लिए सभी कॉल अवरोधन नहीं कर सकता है और सभी व्युत्पन्न वर्ग कि इंटरफ़ेस को लागू करने के लिए कि लॉगिंग और धागा सुरक्षा जोड़ना होगा ।
स्रोत
2010-07-22 09:41:51
इंटरफ़ेस! = सार्वजनिक सदस्य। आपका इंटरफ़ेस आपका _documentation_ है, न कि आपकी हेडर फ़ाइल। –