2011-06-16 8 views
25

संभव डुप्लिकेट:
interface vs abstract classअगर मैं php में अमूर्त वर्ग का उपयोग करता हूं तो क्या फायदा है?

क्या लाभ हैं अगर मैं php में सार वर्ग का उपयोग करें?

यदि मैं सार कक्षा या इंटरफेस का उपयोग करता हूं तो क्या उद्देश्य है?

दोनों बस defenition बाहर शरीर

+1

अधिक: http://stackoverflow.com/search?q=abstract+class+interface+php – Gordon

+0

हां मैं समझता हूं .. प्रश्न लिखने के दस मिनट बाद मैंने – Sreeraj

+4

बह को बंद करना चाहते हैं? :( –

उत्तर

63

यदि मैं PHP में अमूर्त वर्ग का उपयोग करता हूं तो क्या फायदा है? मैं उस पर कुछ भी अच्छा नहीं मिल सकता। मुझे लगता है कि मैं अमूर्त वर्ग का उपयोग करके आसानी से सभी काम कर सकता हूं?

आप स्वाभाविक रूप से कर सकते हैं। हालांकि, अगर ऐसी कई वस्तुएं हैं जो काफी समान हैं, तो यह सामान्य कार्यक्षमता को "आधार" वर्ग में निकालने में मदद कर सकती है, जिसका अर्थ है कि आपको उस तर्क को डुप्लिकेट करने की आवश्यकता नहीं है।

वास्तव में दो कारण हैं। मेरे लिए पहला कारण यह होगा कि आपके सार वर्ग के सभी वंशजों को समान प्रकार है, और दोनों सटीक एक ही इंटरफ़ेस का पालन करते हैं। इसका मतलब है कि उदाहरण के लिए एक पीडीएफ दस्तावेज में एक डॉक्स दस्तावेज़ के समान इंटरफ़ेस होगा, और क्लाइंट कोड को यह ध्यान रखना होगा कि यह किस ऑब्जेक्ट को संभालने में सक्षम है। संक्षिप्त उदाहरण (PHP में)।

<?php 
abstract class Document { 
    protected $author; 

    public function __construct($author) { 
     $this->author = $author; 
    } 

    abstract public function render(); 

    public function author() { 
     return $this->author; 
    } 
} 

class PdfDocument extends Document { 
    public function render() { 
     // do something PDF specific here. 
    } 
} 

class DocxDocument extends Document { 
    public function render() { 
     // do something DOCX specific here. 
    } 
} 


class DocumentHandler { 
    public function handle(Document $document) { 
     $this->log('Author has been read ' . $document->author()); 
     return $document->render(); 
    } 
} 

सबसे पहले; इस तथ्य को ध्यान में रखें कि दस्तावेज़हैंडलर क्लास का कोई ज्ञान नहीं है कि यह वास्तव में किस प्रकार का दस्तावेज़ है। यह भी परवाह नहीं करता है। यह अज्ञानी है। हालांकि, यह जानता है कि किन विधियों पर कॉल किया जा सकता है, क्योंकि दो प्रकार के दस्तावेज़ों के बीच इंटरफ़ेस समान हैं। इसे पॉलिमॉर्फिज्म कहा जाता है, और दस्तावेज़ इंटरफ़ेस के कार्यान्वयन के साथ आसानी से हासिल किया जा सकता है।

दूसरा भाग है; यदि प्रत्येक दस्तावेज़ में एक लेखक होता है, और उस लेखक से हमेशा अनुरोध किया जाता है, तो आप विधि को पीडीएफडी दस्तावेज़ के साथ-साथ डॉक्स डॉक्यूमेंट पर कॉपी कर सकते हैं, लेकिन आप स्वयं को डुप्लिकेट कर रहे हैं। उदाहरण के लिए, यदि आप निर्णय लेते हैं कि आप चाहते हैं कि लेखक राजधानियों के साथ लिखे जाएं, और आप इस $ - $ लेखक को ucwords ($ this-> लेखक) में बदल देंगे, तो आपको इसे जितनी बार करना होगा, उस विधि की प्रतिलिपि बनाई है। एक अमूर्त वर्ग का उपयोग करके, आप वर्ग को अपूर्ण के रूप में चिह्नित करते समय व्यवहार को परिभाषित कर सकते हैं। यह बहुत आसान में आता है।

आशा है कि मदद करता है।

+0

के लिए यहां होगा बेरी धन्यवाद। – Sreeraj

+1

बहुत बढ़िया स्पष्टीकरण, धन्यवाद! –

+1

अच्छा स्पष्टीकरण – Mirko

2

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

10

सार कक्षाएं आपकी सहायता करती हैं जब आपके पास कई विधियां होती हैं जिनमें समान विधियां होती हैं।

उदाहरण:

abstract class Foo { 
    public function foo1() { 
    //Do something 
    } 

    public abstract class foo2(); 
} 

class Bar extends Foo { 
    public class foo2() { 
    //Do something 
    } 
} 

class Baz extends Foo { 
} 

क्या होगा:

  • आप उपयोग नहीं कर सकते new Foo();, Foo सार है।
  • आप Bar.foo1() और Baz.foo1() का उपयोग करने में सक्षम होंगे, वे वही काम करेंगे।
  • आपको एक त्रुटि होगी, क्योंकि Baz abstact विधि foo2 को लागू नहीं करता है।

उदाहरण है जहां यह उपयोगी है:

abstract class Shape { 
    public function display() { /* ... */ } 
    //... 
} 

class Circle extends Shape { 
    //... 
} 

class Rectangle extends Shape { 
    //... 
} 

//... 

आप हर वर्ग display() करने में सक्षम होना चाहते हैं, लेकिन अपने आप में "आकार" के रूप में ऐसी कोई बात नहीं है।

1

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

interface Shape { 
    public function getArea(); 
} 

Circle और Square कि विधि getArea() के लिए अलग कार्यान्वयन प्रदान करेगा की तरह इस इंटरफेस को लागू विभिन्न वर्गों की एक संख्या हो सकती है।

function displayInformation(Shape $shape) { 
    echo "The area of this shape is: " . $shape->getArea(); 
} 

आप किसी भी वस्तु गुजर सकता है इस समारोह के लिए Shape इंटरफ़ेस कार्यान्वित किया है और इंटरफेस गारंटी देता है कि getArea() विधि मौजूद है: फिर आप एक समारोह है कि किसी भी ज्यामितीय आकार के बारे में जानकारी प्रदर्शित करता है को लागू कर सकते हैं।

बेशक, ये अवधारणा प्रोग्रामिंग भाषाओं में अधिक उपयोगी हो सकती हैं जो PHP से अधिक दृढ़ता से टाइप की जाती हैं।