2010-04-23 12 views
7

जो मैंने पढ़ा है, ऐसा लगता है कि कोई इंटरफ़ेस से बातचीत कर सकता है?एक इंटरफेस के साथ बातचीत?

उदाहरण के लिए। आइए कहें कि मुझे एक खाली विधि के साथ एक इंटरफ़ेस मिला है "खाने()"

फिर 2 उप-वर्ग इस इंटरफ़ेस को कार्यान्वित कर रहे हैं।

क्या मेरा नियंत्रक केवल इंटरफेस के साथ बातचीत कर सकता है और इसका खा सकता है() विधि?

इस लिंक strategy

+0

इंटरफ़ेस का कुछ विचार यहां प्राप्त करें http://stackoverflow.com/q/8531292/1055241 – gprathour

उत्तर

13

आप इसे किसी भी परिभाषित स्थिरांक तक पहुँचने या TypeHints के लिए उपयोग करने के अलावा एक अंतरफलक के साथ बातचीत नहीं कर सकते में चित्र पर एक नजर है। इंटरफेस में विधि बोडियां नहीं हैं। वे पूरी तरह से कक्षाओं को लागू करने वाले अनुबंध को परिभाषित करने के लिए हैं।

interface Logger 
{ 
    const FOO = 1; 
    public function log($msg); 
} 

echo Logger::FOO; // 1 
Logger::log($msg); // Fatal error: Cannot call abstract method Logger::log() 
new Logger;  // Fatal error: Cannot instantiate interface Logger 

http://php.net/manual/en/language.oop5.interfaces.php


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

इन कक्षाओं पर विचार करें:

Class DbLog implements Logger 
{ 
    public function log($msg) { /* log $msg to database */ } 
} 

Class FileLog implements Logger 
{ 
    public function log($msg) { /* log $msg to file */ } 
} 

दोनों वर्गों Logger को लागू करने और उनके लिए एक विधि log($msg) करना होगा। आप मूल रूप से कह रहे हैं: "हे क्लास, यदि आप लॉगर बनना चाहते हैं, तो सुनिश्चित करें कि मैं आप पर लॉग() कॉल कर सकता हूं।"। अब आप अपने कोड में कहीं आप अगर यह FileLog, DbLog या किसी अन्य ठोस लॉगर हो जाता है परवाह नहीं है की तरह

class Foo 
{ 
    protected $logger; 
    public function __construct(Logger $logger) 
    { 
     $this->logger = $logger; 
     $this->logger->log('I can haz logger! Yay!'); 
    } 
} 

Foo एक वर्ग है कि एक लकड़हारा की जरूरत है, हो सकता है। यह सिर्फ परवाह करता है कि इसे कोई लॉगर यह log() पर कॉल कर सकता है। फू को log() में रुचि नहीं है। सभी Foo परवाह है log() पर कॉल करने में सक्षम है। हालांकि आप इंटरफ़ेस में log() पर कॉल नहीं कर रहे हैं। आप इसे कंक्रीट क्लास में बुला रहे हैं जो Foo पर पास किया गया था, लेकिन एक यूएमएल आरेख में आप इसका प्रतिनिधित्व करेंगे जैसा कि आपने लिंक किए गए पेज में दिखाया है, क्योंकि आप इंटरफ़ेस के विरुद्ध कोड किए गए हैं।

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

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

+0

क्या आपने पोस्ट किए गए लिंक को देखा है? मैंने सोचा कि "संदर्भ" यह इंटरफ़ेस –

+0

@ajsie हां के साथ बातचीत कर रहा था, असल में, मैं वह व्यक्ति हूं जो सोर्समेकिंग लिंक के साथ SO को कूड़ा कर रहा है, इसलिए आपको शायद यह मेरी एक पोस्ट के माध्यम से मिलेगा :) इंटरफ़ेस का विचार केवल एपीआई प्रदान करने के लिए, कार्यान्वयन नहीं है। अगर कुछ भी है, तो यह एक अप्रत्यक्ष बातचीत है। मेरा यह जवाब देखें: http://stackoverflow.com/questions/1957732/can-i-include-code-into-a-php-class/1957830#1957830 – Gordon

+0

मुझे लगता है कि मैंने किया ... आप हर जगह! :) www.developers.com में जावा के लिए वास्तव में अच्छा डिज़ाइन पैटर्न संदर्भ है, जिसमें कोड उदाहरणों के साथ प्रत्येक डिज़ाइन पैटर्न शामिल है। क्या आप php के लिए ऐसे संदर्भ पृष्ठ को जानते हैं? यह बहुत उपयोगी होगा। लेकिन मुझे कोई नहीं मिला। –

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