सामान्य रूप से, कॉन्वर्सिस आपको बेस क्लास इंटरफ़ेस में सत्य की तुलना में व्युत्पन्न क्लास इंटरफ़ेस में अधिक जानकारी व्यक्त करने की अनुमति देता है। व्युत्पन्न वर्ग का व्यवहार आधार वर्ग की तुलना में अधिक विशिष्ट है, और अंतर भिन्नता (अंतर का एक पहलू) व्यक्त करता है।
जब आप गब्बिन्स के पदानुक्रमों से संबंधित होते हैं, तो यह उपयोगी होता है, जहां कुछ ग्राहक बेस क्लास इंटरफ़ेस का उपयोग करना चाहते हैं, लेकिन अन्य क्लाइंट व्युत्पन्न क्लास इंटरफ़ेस का उपयोग करेंगे।स्थिरांक-शुद्धता लोप के साथ:
class URI { /* stuff */ };
class HttpAddress : public URI {
bool hasQueryParam(string);
string &getQueryParam(string);
};
class Resource {
virtual URI &getIdentifier();
};
class WebPage : public Resource {
virtual HttpAddress &getIdentifier();
};
ग्राहक जो जानते हैं कि वे एक वेबपृष्ठ है (ब्राउज़रों, शायद) पता है कि यह क्वेरी पैरामीटर को देखने के लिए सार्थक है। ग्राहक जो बेस बेस क्लास का उपयोग कर रहे हैं, ऐसी कोई चीज़ नहीं जानते हैं। वे हमेशा HttpAddress&
को URI&
परिवर्तनीय या अस्थायी रूप से बाध्य करेंगे।
यदि उन्हें संदेह है, लेकिन यह नहीं पता कि उनके संसाधन ऑब्जेक्ट में एक HttpAddress है, तो वे dynamic_cast
कर सकते हैं। लेकिन कॉन्वर्सिस "सिर्फ जानने" से बेहतर है और उसी कारण से कास्ट कर रहा है कि स्थैतिक टाइपिंग बिल्कुल उपयोगी है।
विकल्प हैं - URI
पर getQueryParam
फ़ंक्शन को चिपकाएं लेकिन hasQueryParam
सबकुछ के लिए झूठी वापसी करें (यूआरआई इंटरफ़ेस को अव्यवस्थित करें)। WebPage::getIdentifier
को URL&
लौटने के लिए परिभाषित किया गया है, वास्तव में HttpIdentifier&
लौटा रहा है, और कॉलर्स एक व्यर्थ dynamic_cast
(कॉलिंग कोड को बंद कर देते हैं, और वेबपृष्ठ का दस्तावेज़ीकरण करते हैं जहां आप कहते हैं कि "यूआरएल लौटाया गया है एचटीपीएड्रेस को गतिशील रूप से जा सकता है")। getHttpIdentifier
फ़ंक्शन WebPage
पर जोड़ें (WebPage
इंटरफ़ेस को अव्यवस्थित करें)। या केवल इसका उपयोग करने के लिए कॉन्वर्सिस का उपयोग करें, जो इस तथ्य को व्यक्त करता है कि WebPage
में FtpAddress
या MailtoAddress
नहीं है, इसमें HttpAddress
है।
आखिरकार एक उचित तर्क है कि आपको गब्बिन्स के पदानुक्रम नहीं होना चाहिए, केवल गब्बिन्स से संबंधित पदानुक्रमों को छोड़ दें। लेकिन वे कक्षाएं शुद्ध आभासी तरीकों के साथ आसानी से इंटरफेस हो सकती हैं, इसलिए मुझे नहीं लगता कि यह कॉन्वर्सिस का उपयोग करने की वैधता को प्रभावित करता है।
स्रोत
2009-08-11 16:04:54
जब मैंने प्रश्न पढ़ा तो मेरी प्रतिक्रिया बिल्कुल वही थी। समस्या क्या है - कॉन्वेंट रिटर्न प्रकारों का उपयोग न करें! –