2009-04-23 16 views
18

इंटरफेस में कन्स्ट्रक्टर विधियां खराब हैं?कन्स्ट्रक्टर विधियां

+4

चूंकि आप इंटरफ़ेस को तुरंत चालू नहीं कर सकते हैं, आप इसका उपयोग कैसे करेंगे? –

+2

मेरा मतलब है कि एक इंटरफेस में एक कन्स्ट्रक्टर निर्दिष्ट करना। –

+0

व्यक्तिपरक टैग हटा दिया गया। इस सवाल के बारे में कुछ भी व्यक्तिपरक प्रतीत नहीं होता है। – JaredPar

उत्तर

2

चाहे वे खराब हों या नहीं, मुझे किसी भी भाषा से अवगत नहीं है जिसमें इंटरफेस पर एक कन्स्ट्रक्टर निर्दिष्ट करने की क्षमता है।

कहा जा रहा है कि, हालांकि, मुझे व्यक्तिगत रूप से विश्वास नहीं है कि किसी ऑब्जेक्ट का निर्माता उस ऑब्जेक्ट के इंटरफ़ेस का हिस्सा है और इस तरह एक इंटरफ़ेस में एक कन्स्ट्रक्टर जोड़ने से प्राकृतिक लचीलापन बाधित हो जाता है जो हस्तक्षेप करता है।

+7

देर हो चुकी है, लेकिन PHP में यह क्षमता है। (यह इसे एक फीचर लायक नहीं बनाता है, लेकिन यह केवल मेरी राय है।) – lotsoffreetime

12

वे खराब हैं कि वे कोई उद्देश्य नहीं देते हैं। इसके मूल पर, एक इंटरफेस बस एक डेटा पास अनुबंध है। इंटरफ़ेस से जुड़ा कोई अनुकरण नहीं है और इसलिए कन्स्ट्रक्टर के लिए प्रारंभ करने और आवश्यकता की आवश्यकता नहीं है।

यदि आपको कुछ प्रकार की प्रारंभिक आवश्यकता है तो एक अमूर्त वर्ग का उपयोग करके आप बेहतर तरीके से बंद कर दें।

+6

बीटीडब्ल्यू, मुझे लगता है कि इंटरफ़ेस "बस डेटा पास करने वाले अनुबंध" से अधिक है। इसे जिम्मेदारी अनुबंध के रूप में सोचा जाना चाहिए जिसमें बदले में हस्ताक्षर विनिर्देश शामिल है। – isntn

+3

@isntn, इसके मूल पर सभी इंटरफेस यह निर्दिष्ट करते हैं कि डेटा कैसे पास किया जाए। एकमात्र ऐसा लगता है कि व्यवहार की गारंटी अनुबंध और परीक्षण ढांचे हैं। इंटरफेस व्यवहार को इंगित कर सकते हैं लेकिन वे – JaredPar

+0

की गारंटी नहीं दे सकते हैं मैं जेरेडपार से सहमत हूं। यदि आपके इंटरफ़ेस में कन्स्ट्रक्टर है, तो ऐसा लगता है कि आपको एक अमूर्त कक्षा की आवश्यकता है। इस इंटरफेस को लागू करने वाले घटकों के लिए आपको कुछ सामान्य व्यवहार मिलेगा, कम से कम __construct विधि को पारित चर से संबंधित सेटर/गेटर विधियों के लिए, इसलिए आपको इस संदर्भ में एक अमूर्त वर्ग में जाना चाहिए। –

4

हालांकि इंटरफेस में अधिकांश भाषाओं में रचनाकार नहीं हो सकते हैं, Factory pattern एक इंटरफेस के समान वस्तुओं का निर्माण करने के लिए अनुबंध प्रदान करता है। उस पर एक नज़र डालें।

36

लोग क्यों सोचते हैं कि कोई भी इंटरफ़ेस को चालू करना चाहता है?

हम क्या करना चाहते हैं कि अन्य इंटरफ़ेस विधियों की तरह, कन्स्ट्रक्टर को कार्यान्वित करने के लिए कार्यान्वयन करने के लिए मजबूर करना है।

एक इंटरफ़ेस अनुबंध की तरह है। मान लें कि मेरे पास एक इंटरफ़ेस कतार है, और मैं यह सुनिश्चित करना चाहता हूं कि कार्यान्वयनकर्ता एक तर्क के साथ एक कन्स्ट्रक्टर बनाते हैं, जो सिंगलटन कतार (केवल उस तत्व के साथ एक नई कतार) बनाता है। यह अनुबंध का हिस्सा क्यों नहीं होना चाहिए? कम से कम जावा इंटरफेस के साथ, जिसे निर्दिष्ट नहीं किया जा सकता है।

+12

+1 तो, नहीं, वे खराब नहीं हैं। 'लोग क्यों सोचते हैं कि कोई भी इंटरफ़ेस को चालू करना चाहता है?' सहमत, आईएमओ ओपी यह नहीं पूछ रहा था। यदि किसी वर्ग को हर बार एक मूल्य की आवश्यकता होती है तो यह तत्काल (कहें, एक रैपर वर्ग) है, ऐसा लगता है कि डेटा पास करने वाला अनुबंध उपयोगी हो सकता है। विशेष रूप से PHP में जहां विधियों को ओवरराइड नहीं किया जा सकता - कन्स्ट्रक्टर एक निश्चित व्यवहार में "लॉक इन" होता है। – Ben

+4

PHP में विधियों को ओवरराइड किया जा सकता है लेकिन अधिभारित नहीं किया जा सकता है। –

+2

शायद @ स्टेव कन्स्ट्रक्टर के हस्ताक्षर से मेल खाने के दायित्व का जिक्र कर रहा था। – XedinUnknown

5

सबसे पहले, मैं असहमत हूं कि इंटरफ़ेस केवल डेटा पास करने वाला अनुबंध है। यदि यह सत्य था तो आपको इंटरफेस में गुणों को परिभाषित करने की अनुमति होगी।

मैं बिल्कुल नहीं लगता होगा ऐसा लगता है कि कुछ करने के लिए अजीब है:

interface IDBConnection 
{ 
    function __construct($connectionString); 
    function executeNonQuery($commandText, $paramters=null); 
    function executeScalar($commandText, $paramters=null); 
    function executeSingle($commandText, $paramters=null); 
    function executeArray($commandText, $paramters=null); 
} 

यह बजाय सिर्फ एक डेटा अनुबंध होने का सरल प्रतिबिंब के आधार पर डेटा का उपयोग के लिए तीसरे पक्ष वर्गों के उदाहरण बना करने के लिए सक्षम होगा।

मुझे पूरा यकीन है कि यह सबसे अच्छा उदाहरण नहीं है, मैं असली दुनिया में एक सार आधार वर्ग के लिए जाऊंगा, लेकिन मुझे भी यकीन है कि एक निर्माता को परिभाषित करने के लिए पूरी तरह से वैध कारण हैं एक इंटरफ़ेस में विधियों का अनुबंध जिसे मैंने नहीं सोचा है।

मैंने इसे नहीं देखा है, लेकिन मुझे यह अजीब या बुरा नहीं लगता।

संबंधित मुद्दे