जावा class
और के बीच एक स्पष्ट अंतर बनाता है interface
। (मेरा मानना है कि C # भी करता है, लेकिन मुझे इसका कोई अनुभव नहीं है)। C ++ लिखते समय हालांकि कक्षा और इंटरफ़ेस के बीच कोई भाषा लागू नहीं है।
नतीजतन मैंने हमेशा जावा में कई विरासत की कमी के लिए इंटरफ़ेस को देखा है। इस तरह का भेद करना C ++ में मनमाना और अर्थहीन लगता है।
मैंने हमेशा "चीजों को सबसे स्पष्ट तरीके से लिखने" दृष्टिकोण के साथ जाना है, इसलिए यदि C ++ में मुझे जावा में एक इंटरफ़ेस कहा जा सकता है, जैसे:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() = 0;
};
और फिर मैंने फैसला किया कि अधिकांश कार्यान्वयनकर्ता Foo
कुछ सामान्य कार्यक्षमता साझा करना चाहते हैं जो मैं शायद लिखूंगा:
class Foo {
public:
virtual void doStuff() = 0;
~Foo() {}
protected:
// If it needs this to do its thing:
int internalHelperThing(int);
// Or if it doesn't need the this pointer:
static int someOtherHelper(int);
};
जो तब जावा इंटरफ़ेस में इसे इंटरफ़ेस नहीं बनाता है।
इसके बजाय C ++ की दो महत्वपूर्ण अवधारणाएं हैं, जो एक ही अंतर्निहित विरासत समस्या से संबंधित हैं:
virtual
inhertianceआधार के रूप में उपयोग किए जाने पर बिना सदस्य चर वाली कक्षाएं कोई अतिरिक्त स्थान नहीं ले सकती हैं
"बेस क्लास सबोबेज में शून्य आकार हो सकता है"
उन लोगों में से मैं जहाँ भी संभव हो # 1 से बचने की कोशिश करता हूं - यह एक परिदृश्य का सामना करना दुर्लभ है जहां यह वास्तव में "सबसे साफ" डिजाइन है। # 2 हालांकि "इंटरफ़ेस" और C ++ भाषा सुविधाओं की मेरी समझ के बीच एक सूक्ष्म, लेकिन महत्वपूर्ण अंतर है। इस के परिणामस्वरूप मैं वर्तमान में (लगभग) सी ++ में "इंटरफेस" के रूप में चीजों को संदर्भित नहीं करता हूं और आधार वर्गों और उनके आकारों के संदर्भ में बात करता हूं। मैं कहूंगा कि C ++ "इंटरफ़ेस" के संदर्भ में एक मिथ्या नाम है।
यह मेरे ध्यान में आया है कि बहुत से लोग इस तरह का भेद नहीं करते हैं।
- क्या मैं (जैसे
protected
) गैर-virtual
फ़ंक्शंस को C ++ में "इंटरफ़ेस" में मौजूद होने की अनुमति देकर कुछ भी खोने के लिए खड़ा हूं ? (मेरी भावना बिल्कुल विपरीत है - साझा कोड के लिए एक अधिक प्राकृतिक स्थान) - क्या "इंटरफ़ेस" शब्द C ++ में सार्थक है - क्या इसका अर्थ केवल शुद्ध है
virtual
या यह C ++ वर्ग को कॉल करने के लिए उचित होगा, जिसमें कोई सदस्य अभी भी इंटरफ़ेस नहीं रखता है ?
~Foo() {}
अमूर्त वर्ग में एक सार्वजनिक हर परिस्थिति में (लगभग) एक त्रुटि है।
internalHelperThing
लगभग सभी मामलों में नकली जा सकता है।