PHP

2009-12-05 5 views
6

में सार कीवर्ड, अरे, मैं PHP के साथ काफी अनुभवी हूं लेकिन मुझे पता नहीं है कि जब ऑब्जेक्ट उन्मुख प्रोग्रामिंग के लिए आता है तो कीवर्ड सार क्या करता है। क्या कोई सादे अंग्रेजी में समझा सकता है जिसका उपयोग इसके लिए किया जा सकता है?PHP

मैं अमूर्त कीवर्ड का उपयोग किस स्थितियों में करूंगा? यह वर्ग/इंटरफेस कैसे बदलता है?

उत्तर

15

(उम्मीद है कि यह काफी सरल है - मुझे नहीं लगता कि मैं बेहतर कर सकते हैं ^^)

एक abstract वर्ग instanciated नहीं किया जा सकता: यदि आप केवल एक और वर्ग है कि abstract वर्ग से विरासत बना सकते हैं , और उस बच्चे वर्ग को instanciate।

और यदि आप abstract के रूप में कुछ विधियों की घोषणा करते हैं, तो उन्हें बाल वर्ग में परिभाषित किया जाना चाहिए, क्योंकि यह एक अस्थिर होना चाहिए।

7

एक वर्ग सार घोषित करने का अर्थ है कि इसे उपयोग करने के लिए उप-वर्गीकृत किया जाना चाहिए। एक अमूर्त वर्ग को तत्काल नहीं किया जा सकता है। कोई इसे एक विस्तारित इंटरफ़ेस के रूप में देख सकता है जिसमें कार्यान्वयन कोड (इंटरफ़ेस के विपरीत) शामिल हो सकता है।

एक विधि सार घोषित करके, आप विधि को लागू करने के लिए उप वर्ग को मजबूर करते हैं।

0

हालांकि आप एक अमूर्त वर्ग का दृष्टांत नहीं कर सकते, तो आप ठोस तरीकों/गुण/चर घोषणा कर सकते हैं (सी # में, AFAIK) जो व्युत्पन्न वर्ग

class Program 
    { 
     static void Main(string[] args) 
     { 
      Dog a = new Dog(); 
      //concrete properties and methods in abstract base class 
      //are available to derived class 
      a.Name = "SuperDog"; 
      a.EatFood(); 
      //And now calling Dog's method 
      a.Speak();    
      Console.WriteLine(a.GetType()); 

     } 
    } 

    public abstract class Animal 
    { 
     public string Name { get; set; } 
     public void EatFood() 
     { 
      Console.WriteLine("Eating.."); 
     } 
    } 

    public class Dog :Animal 
    { 
     public void Speak() 
     { 
      Console.WriteLine("Bow .. Bow"); 
     } 
    } 
1

परिभाषा ऊपर उल्लेख किया गया है करने के लिए उपलब्ध हो जाएगा, अब मैं आपको एक उदाहरण देने का प्रयास करेगा:

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

abstract class ticket{ 

    public function material() 
    { 
     return 'Paper'; 
    } 

} 

abstract class creditcard{ 

    public function material() 
    { 
     return 'Plastic'; 
    } 

    abstract function setCode(); // the ";" semicolon is important otherwise it will cause an error 

} 

class key extends ticket{ 

    public function getMaterial() 
    { 
     return parent::material(); 
    } 
} 

class anotherKey extends creditcard{ 

    public function setCode($code) 
    { 
     $this->code = $code; 
    } 
} 

हम "setCode" विधि को परिभाषित नहीं है, तो पार्सर पर "new anotherKey"

1

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

यहाँ कोड उदाहरण है

<?php 
abstract class AbstrakteKlasse { 
    public abstract function methode(); 
} 

class ImplementierendeKlasse extends AbstrakteKlasse { 
    public function methode() { 
    print "ImplementierendeKlasse::methode() aufgerufen.\n"; 
    } 
} 

$objekt = new ImplementierendeKlasse; 
$objekt->methode(); 
?> 
+0

.... Deutsch;) sieht आदमी hier सेल्टन –

+0

ACH इतना ;-) खेद इच्छा अगली बार फिर नहीं होता ;-) – streetparade

+0

कोई समस्या नहीं;) मैं जर्मनी से भी आती हूं। मैं बस यह उल्लेख करना चाहता था कि आपने अपने उदाहरण कोड में जर्मन लिखा है, जो गैर-जर्मन प्रोग्रामर आपके वर्गों के वास्तविक नामकरण को समझने की कोशिश करता है, जो किसी प्रकार का भ्रम पैदा कर सकता है। –

0

Abstract classes are classes that contain one or more abstract methods. An abstract method is a method that is declared, but contains no implementation. Abstract classes may not be instantiated, and require subclasses to provide implementations for the abstract methods.

1. का दृष्टांत नहीं कर सकते सार वर्ग: कक्षा सार रूप में परिभाषित किया instantiated नहीं किया जा सकता है, और किसी भी वर्ग है कि कम से कम एक सार विधि शामिल भी होना चाहिए सार।

नीचे उदाहरण:

abstract class AbstractClass 
{ 

    abstract protected function getValue(); 
    abstract protected function prefixValue($prefix); 


    public function printOut() { 
     echo "Hello how are you?"; 
    } 
} 

$obj=new AbstractClass(); 
$obj->printOut(); 
//Fatal error: Cannot instantiate abstract class AbstractClass 

2।कम से कम एक अमूर्त विधि वाले किसी भी वर्ग को भी अमूर्त होना चाहिए: सार वर्ग में अमूर्त और गैर-अमूर्त विधियां हो सकती हैं, लेकिन इसमें कम से कम एक सार विधि होनी चाहिए। यदि किसी वर्ग में कम से कम एक सार विधि है, तो कक्षा को सार घोषित किया जाना चाहिए।

Note: Traits support the use of abstract methods in order to impose requirements upon the exhibiting class.

नीचे उदाहरण:

class Non_Abstract_Class 
{ 
    abstract protected function getValue(); 

    public function printOut() { 
     echo "Hello how are you?"; 
    } 
} 

$obj=new Non_Abstract_Class(); 
$obj->printOut(); 
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue) 

3. एक सार विधि शरीर शामिल कर सकते हैं नहीं: सार के रूप में परिभाषित तरीके बस विधि के हस्ताक्षर की घोषणा - वे कार्यान्वयन को परिभाषित नहीं कर सकते हैं। लेकिन एक गैर-अमूर्त विधि कार्यान्वयन को परिभाषित कर सकती है।

abstract class AbstractClass 
{ 
    abstract protected function getValue(){ 
    return "Hello how are you?"; 
    } 

    public function printOut() { 
     echo $this->getValue() . "\n"; 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    protected function getValue() { 
     return "ConcreteClass1"; 
    } 

    public function prefixValue($prefix) { 
     return "{$prefix}ConcreteClass1"; 
    } 
} 

$class1 = new ConcreteClass1; 
$class1->printOut(); 
echo $class1->prefixValue('FOO_') ."\n"; 
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body 

4. जब एक अमूर्त वर्ग से इनहेरिट, सभी तरीकों माता पिता के वर्ग घोषणा में सार चिह्नित बच्चे से परिभाषित किया जाना चाहिए: यदि आप एक अमूर्त वर्ग के वारिस हैं, तो आप सभी सार तरीकों के कार्यान्वयन प्रदान करने के लिए इस में।

abstract class AbstractClass 
{ 
    // Force Extending class to define this method 
    abstract protected function getValue(); 

    // Common method 
    public function printOut() { 
     print $this->getValue() . "<br/>"; 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    public function printOut() { 
     echo "swat"; 
    } 

} 
$class1 = new ConcreteClass1; 
$class1->printOut(); 
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue) 

5. एक ही (या एक कम सीमित) दृश्यता: जब एक अमूर्त वर्ग से इनहेरिट, सभी तरीकों माता पिता के वर्ग घोषणा में सार चिह्नित बच्चे द्वारा परिभाषित किया जाना चाहिए; इसके अतिरिक्त, इन तरीकों को उसी (या कम प्रतिबंधित) दृश्यता के साथ परिभाषित किया जाना चाहिए। उदाहरण के लिए, यदि सार विधि को संरक्षित के रूप में परिभाषित किया गया है, तो फ़ंक्शन कार्यान्वयन को या तो संरक्षित या सार्वजनिक के रूप में परिभाषित किया जाना चाहिए, लेकिन निजी नहीं।

Note that abstract method should not be private.

abstract class AbstractClass 
{ 

    abstract public function getValue(); 
    abstract protected function prefixValue($prefix); 

     public function printOut() { 
     print $this->getValue(); 
    } 
} 

class ConcreteClass1 extends AbstractClass 
{ 
    protected function getValue() { 
     return "ConcreteClass1"; 
    } 

    public function prefixValue($prefix) { 
     return "{$prefix}ConcreteClass1"; 
    } 
} 
$class1 = new ConcreteClass1; 
$class1->printOut(); 
echo $class1->prefixValue('FOO_') ."<br/>"; 
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass) 

6. सार तरीकों में से हस्ताक्षर से मेल खाना चाहिए: जब एक अमूर्त वर्ग से इनहेरिट, सभी तरीकों माता पिता के वर्ग घोषणा में सार बच्चे द्वारा परिभाषित किया जाना चाहिए चिह्नित; तरीकों के हस्ताक्षर मिलान करना चाहिए, यानी प्रकार संकेत और आवश्यक तर्कों की संख्या एक जैसी होनी चाहिए। उदाहरण के लिए, यदि बाल वर्ग वैकल्पिक तर्क को परिभाषित करता है, जहां अमूर्त विधि का हस्ताक्षर नहीं होता है, तो हस्ताक्षर में कोई संघर्ष नहीं होता है।

abstract class AbstractClass 
{ 

    abstract protected function prefixName($name); 

} 

class ConcreteClass extends AbstractClass 
{ 


    public function prefixName($name, $separator = ".") { 
     if ($name == "Pacman") { 
      $prefix = "Mr"; 
     } elseif ($name == "Pacwoman") { 
      $prefix = "Mrs"; 
     } else { 
      $prefix = ""; 
     } 
     return "{$prefix}{$separator} {$name}"; 
    } 
} 

$class = new ConcreteClass; 
echo $class->prefixName("Pacman"), "<br/>"; 
echo $class->prefixName("Pacwoman"), "<br/>"; 
//output: Mr. Pacman 
//  Mrs. Pacwoman 

7. सार वर्ग एकाधिक वंशानुक्रम का समर्थन नहीं करता: सार वर्ग कर सकते हैं एक और अमूर्त वर्ग फैली हुई है, सार वर्ग interface.But के कार्यान्वयन यह एकाधिक वंशानुक्रम का समर्थन नहीं करता प्रदान कर सकते हैं।

interface MyInterface{ 
    public function foo(); 
    public function bar(); 
} 

abstract class MyAbstract1{ 
    abstract public function baz(); 
} 


abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{ 
    public function foo(){ echo "foo"; } 
    public function bar(){ echo "bar"; } 
    public function baz(){ echo "baz"; } 
} 

class MyClass extends MyAbstract2{ 
} 

$obj=new MyClass; 
$obj->foo(); 
$obj->bar(); 
$obj->baz(); 
//output: foobarbaz 

Note: Please note order or positioning of the classes in your code can affect the interpreter and can cause a Fatal error. So, when using multiple levels of abstraction, be careful of the positioning of the classes within the source code.

उदाहरण कारण होगा नीचे

गंभीर त्रुटि: क्लास 'घोड़ा' नहीं मिला

class cart extends horse { 
    public function get_breed() { return "Wood"; } 
} 

abstract class horse extends animal { 
    public function get_breed() { return "Jersey"; } 
} 

abstract class animal { 
    public abstract function get_breed(); 
} 

$cart = new cart(); 
print($cart->get_breed()); 
संबंधित मुद्दे

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