क्या मैं PHP में 1 से अधिक वर्ग का उपयोग करके एक वर्ग का विस्तार कर सकता हूं?


150

अगर मेरे पास कई फ़ंक्शंस हैं, जिनकी मुझे ज़रूरत है, लेकिन संगठन के लिए अलग से स्टोर करना चाहते हैं, तो क्या मैं दोनों के लिए एक क्लास बढ़ा सकता हूं?

अर्थात class a extends b extends c

संपादित करें: मुझे पता है कि एक समय में एक कक्षा का विस्तार कैसे किया जाता है, लेकिन मैं एक ऐसी विधि की तलाश कर रहा हूं जो तुरंत कई आधार वर्गों का उपयोग करते हुए एक वर्ग का विस्तार कर सके - AFAIK आप इसे PHP में नहीं कर सकते हैं, लेकिन इसका सहारा लिए बिना इसके चारों ओर तरीके होने चाहिए। class c extends b,class b extends a


एकत्रीकरण या इंटरफेस का उपयोग करें। PHP में एकाधिक वंशानुक्रम मौजूद नहीं है।
फ्रेंक

2
मैं इंटरफेस में देख रहा हूं क्योंकि मैं बड़े वर्ग के पदानुक्रमों का बड़ा प्रशंसक नहीं हूं। लेकिन मैं यह नहीं देख सकता कि वास्तव में इंटरफेस कुछ भी कैसे करते हैं?
एटॉमिकहरि

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

2
डेकोरेटर्स sourcemaking.com/design_patterns/decorator या रणनीतियाँ sourcemaking.com/design_patterns/strategy
गॉर्डन

2
कृपया सही उत्तर के रूप में लक्षणों पर विचार करें।
डैनियल

जवाबों:


170

आपके संपादन का उत्तर देना:

यदि आप वास्तव में कई विरासतों को नकली करना चाहते हैं, तो आप जादू फ़ंक्शन __call () का उपयोग कर सकते हैं।

यह बदसूरत है हालांकि यह कक्षा ए के उपयोगकर्ता के दृष्टिकोण से काम करता है:

class B {
    public function method_from_b($s) {
        echo $s;
    }
}

class C {
    public function method_from_c($s) {
        echo $s;
    }
}

class A extends B
{
  private $c;

  public function __construct()
  {
    $this->c = new C;
  }

  // fake "extends C" using magic function
  public function __call($method, $args)
  {
    $this->c->$method($args[0]);
  }
}


$a = new A;
$a->method_from_b("abc");
$a->method_from_c("def");

प्रिंट "एब्सडे"


1
मुझे वास्तव में कक्षा को विस्तारित करने का विचार पसंद है क्या इस तरह से करने की कोई ज्ञात सीमाएं हैं?
अणुव्रत

3
जहाँ तक मुझे पता है, कोई सीमा नहीं है, PHP इस तरह से छोटे हैक्स के लिए एक बहुत ही अनुमेय भाषा है। :) जैसा कि दूसरों ने बताया है, हालांकि यह ऐसा करने का उचित ओओपी तरीका नहीं है।
फ्रेंक

64
आप संरक्षित या निजी तरीकों का उपयोग नहीं कर पाएंगे।
वर्महिट

1
@ जर्महित, हालांकि, मैं इसे उत्पादन में उपयोग के लिए अनुशंसित नहीं करूंगा, एक निजी और संरक्षित तरीकों का उपयोग करने के लिए ReflectionClass का उपयोग कर सकता है।
डेनिस वी

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

138

आपके पास एक वर्ग नहीं हो सकता है जो दो आधार वर्गों का विस्तार करता है। आप नहीं कर सकते थे।

// this is NOT allowed (for all you google speeders)
Matron extends Nurse, HumanEntity

लेकिन आप इस प्रकार एक पदानुक्रम हो सकता है ...

Matron extends Nurse    
Consultant extends Doctor

Nurse extends HumanEntity
Doctor extends HumanEntity

HumanEntity extends DatabaseTable
DatabaseTable extends AbstractTable

और इसी तरह।


क्या आप बता सकते हैं कि पहले नर्स को मैट्रॉन में विरासत में देना क्यों सही है, फिर ह्यूमैनएनेटी की विरासत को नर्स घोषित करें?
क्वर्टी

7
@ क्यूवर्टी क्योंकि मैट्रॉन में एक नर्स के अतिरिक्त गुण होते हैं, जबकि एक नर्स में मानव के सभी गुण होते हैं। इसलिए, मैट्रन एक मानव नर्स है और अंत में मैट्रॉन क्षमताएं हैं
J-Dizzle

58

आप लक्षण का उपयोग कर सकते हैं, जो उम्मीद है कि PHP 5.4 से उपलब्ध होगा।

Traits एकल वंशानुक्रम भाषाओं जैसे PHP में कोड पुन: उपयोग के लिए एक तंत्र है। एक विशेषता विभिन्न वर्ग पदानुक्रमों में रहने वाले कई स्वतंत्र वर्गों में स्वतंत्र रूप से तरीकों के सेट का पुन: उपयोग करने के लिए एक डेवलपर को सक्षम करके एकल विरासत की कुछ सीमाओं को कम करने का इरादा है। ट्रेट्स और कक्षाओं के संयोजन के शब्दार्थ को एक तरह से परिभाषित किया गया है, जो जटिलता को कम करता है और एकाधिक वंशानुक्रम और मिक्सिन्स से जुड़ी विशिष्ट समस्याओं से बचा जाता है।

उन्हें बेहतर रचना और पुन: उपयोग करने में उनकी क्षमता के लिए मान्यता प्राप्त है, इसलिए पर्ल 6, स्क्वीक, स्काला, स्लेट और किले जैसी भाषाओं के नए संस्करणों में उनका एकीकरण है। लक्षण जावा और C # में भी पोर्ट किए गए हैं।

अधिक जानकारी: https://wiki.php.net/rfc/traits


सुनिश्चित करें कि उनका दुरुपयोग न करें। अनिवार्य रूप से वे स्थिर कार्य हैं जो आप वस्तुओं पर लागू होते हैं। आप उन्हें गाली देकर गड़बड़ पैदा कर सकते थे।
निकोला पेटकांस्की

2
मुझे विश्वास नहीं हो रहा है कि यह चयनित उत्तर नहीं है।
डैनियल

18

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


1
मैं आपके दावे के साथ समस्या लूंगा कि ओपी का अनुरोध "खराब ओओ डिजाइन" है ; सिर्फ मिक्सिंस के उद्भव को उस स्थिति का समर्थन करने के लिए देखें जो कई स्रोतों से एक वर्ग में तरीकों को जोड़ रहा है, यह एक अच्छा विचार है। हालांकि मैं आपको यह बताऊंगा कि PHP एक इष्टतम "डिज़ाइन" प्राप्त करने के लिए भाषा सुविधाओं का एक इष्टतम सेट प्रदान नहीं करता है, लेकिन इसका मतलब यह नहीं है कि अनुमानित रूप से उपलब्ध सुविधाओं का उपयोग करना जरूरी है कि यह एक बुरा विचार है; बस @ फ्रेंक के जवाब को देखो।
17

15

मेरा मानना ​​है कि जल्द ही मिक्स-इन को जोड़ने की योजना है।

लेकिन तब तक, स्वीकृत उत्तर के साथ जाएं। आप सार कर सकते हैं कि "विस्तार योग्य" वर्ग बनाने के लिए थोड़ा बाहर:

class Extendable{
  private $extender=array();

  public function addExtender(Extender $obj){
    $this->extenders[] = $obj;
    $obj->setExtendee($this);
  }

  public function __call($name, $params){
    foreach($this->extenders as $extender){
       //do reflection to see if extender has this method with this argument count
       if (method_exists($extender, $name)){
          return call_user_func_array(array($extender, $name), $params);
       }
    }
  }
}


$foo = new Extendable();
$foo->addExtender(new OtherClass());
$foo->other_class_method();

ध्यान दें कि इस मॉडल में "OtherClass" $ foo के बारे में 'पता' करने के लिए मिलता है। अन्यक्लास को इस संबंध को स्थापित करने के लिए "सेटएक्स्टेंडी" नामक एक सार्वजनिक कार्य करने की आवश्यकता है। फिर, यदि यह $ फू से मंगाई जाती है, तो यह आंतरिक रूप से $ foo तक पहुंच सकती है। हालांकि, यह किसी भी निजी / संरक्षित विधियों / चर तक पहुंच नहीं होगा जैसे कि वास्तविक विस्तारित वर्ग होगा।


12

आधार वर्गों के रूप में लक्षणों का उपयोग करें। फिर उन्हें एक मूल वर्ग में उपयोग करें। इसे बढ़ाओ।

trait business{
  function sell(){

  }

  function buy(){

  }

  function collectMoney(){
  }

}

trait human{

   function think(){

   }

   function speak(){

   }

}

class BusinessPerson{
  use business;
  use human;
  // If you have more traits bring more
}


class BusinessWoman extends BusinessPerson{

   function getPregnant(){

   }

}


$bw = new BusinessWoman();
$bw ->speak();
$bw->getPregnant();

देखें कि व्यवसायिक महिला को तार्किक रूप से विरासत में मिला व्यवसाय और मानव दोनों;


मैं php 5.3 के साथ फंस गया हूं, कोई विशेषता समर्थन नहीं है: D
निश्चल गौतम

BusinessWomanइसके स्थान पर गुण का उपयोग क्यों नहीं किया जाता है BusinessPerson? तब आपके पास वास्तविक बहु-विरासत हो सकती है।
SOFe

@ इसके अलावा, क्योंकि BusinessMan भी इसे बढ़ा सकता है। तो जो कभी व्यवसाय कर रहा है, वह व्यापार करने वाले व्यक्ति का विस्तार कर सकता है, और स्वचालित रूप से लक्षण प्राप्त कर सकता है
ऐलिस

जिस तरह से आप यह कर रहे हैं उससे कोई अंतर नहीं है कि एकल विरासत में क्या संभव है जहां बिजनेसपर्सन मानव नामक एक सार वर्ग का विस्तार करता है। मेरा कहना है कि आपके उदाहरण को वास्तव में बहु उत्तराधिकार की आवश्यकता नहीं है।
13

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

9
<?php
// what if we want to extend more than one class?

abstract class ExtensionBridge
{
    // array containing all the extended classes
    private $_exts = array();
    public $_this;

    function __construct() {$_this = $this;}

    public function addExt($object)
    {
        $this->_exts[]=$object;
    }

    public function __get($varname)
    {
        foreach($this->_exts as $ext)
        {
            if(property_exists($ext,$varname))
            return $ext->$varname;
        }
    }

    public function __call($method,$args)
    {
        foreach($this->_exts as $ext)
        {
            if(method_exists($ext,$method))
            return call_user_method_array($method,$ext,$args);
        }
        throw new Exception("This Method {$method} doesn't exists");
    }


}

class Ext1
{
    private $name="";
    private $id="";
    public function setID($id){$this->id = $id;}
    public function setName($name){$this->name = $name;}
    public function getID(){return $this->id;}
    public function getName(){return $this->name;}
}

class Ext2
{
    private $address="";
    private $country="";
    public function setAddress($address){$this->address = $address;}
    public function setCountry($country){$this->country = $country;}
    public function getAddress(){return $this->address;}
    public function getCountry(){return $this->country;}
}

class Extender extends ExtensionBridge
{
    function __construct()
    {
        parent::addExt(new Ext1());
        parent::addExt(new Ext2());
    }

    public function __toString()
    {
        return $this->getName().', from: '.$this->getCountry();
    }
}

$o = new Extender();
$o->setName("Mahdi");
$o->setCountry("Al-Ahwaz");
echo $o;
?>

4
आपके उत्तर में आपके कोड की व्याख्या और विवरण होना चाहिए कि यह समस्या को हल कैसे करता है।
अबेकएफ़चेन

1
यह लगभग आत्म व्याख्यात्मक है, लेकिन कोड के साथ टिप्पणी करना बहुत अच्छा होगा।
हेरोसेलोहिम

अब अगर Ext1 और Ext2 दोनों में एक ही नाम के साथ एक फंक्शन होता है, तो हमेशा Ext1 cwill कहा जाता है, यह सभी मापदंडों पर निर्भर नहीं करेगा।
एलिस

8

@Franck द्वारा वर्तमान में स्वीकृत उत्तर काम करेगा, लेकिन यह वास्तव में एकाधिक वंशानुक्रम नहीं है, लेकिन कक्षा का एक बच्चा उदाहरण के दायरे से बाहर है, __call()शॉर्टहैंड भी है - $this->childInstance->method(args)"एक्सटेंडेड" क्लास में एक्सक्लास क्लास विधि की आवश्यकता है, बस कहीं भी उपयोग करने पर विचार करें ।

सटीक उत्तर

नहीं, आप नहीं कर सकते, क्रमशः, वास्तव में नहीं, जैसा कि कीवर्ड का मैनुअलextends कहता है:

एक विस्तारित वर्ग हमेशा एक एकल आधार वर्ग पर निर्भर होता है, अर्थात एकाधिक वंशानुक्रम समर्थित नहीं होता है।

असली जवाब

हालाँकि @adam ने सही ढंग से सुझाव दिया है कि यह आपको कई hierarchal वंशानुक्रम का उपयोग करने के लिए मना नहीं करता है।

आप एक वर्ग का विस्तार कर सकते हैं, दूसरे के साथ और दूसरे के साथ और इसी तरह ...

इस पर बहुत सरल उदाहरण होगा:

class firstInheritance{}
class secondInheritance extends firstInheritance{}
class someFinalClass extends secondInheritance{}
//...and so on...

महत्वपूर्ण लेख

जैसा कि आपने देखा होगा, आप केवल पदानुक्रम के अनुसार कई (2+) समरूपता कर सकते हैं यदि आपके पास प्रक्रिया में शामिल सभी वर्गों पर नियंत्रण है - इसका मतलब है, आप इस समाधान को लागू नहीं कर सकते हैं जैसे अंतर्निहित कक्षाओं में या कक्षाओं के साथ। बस संपादित नहीं कर सकते हैं - यदि आप ऐसा करना चाहते हैं, तो आपको @Franck समाधान - चाइल्ड इंस्टेंस के साथ छोड़ दिया जाता है।

... और अंत में कुछ आउटपुट के साथ उदाहरण दें:

class A{
  function a_hi(){
    echo "I am a of A".PHP_EOL."<br>".PHP_EOL;  
  }
}

class B extends A{
  function b_hi(){
    echo "I am b of B".PHP_EOL."<br>".PHP_EOL;  
  }
}

class C extends B{
  function c_hi(){
    echo "I am c of C".PHP_EOL."<br>".PHP_EOL;  
  }
}

$myTestInstance = new C();

$myTestInstance->a_hi();
$myTestInstance->b_hi();
$myTestInstance->c_hi();

जो आउटपुट देता है

I am a of A 
I am b of B 
I am c of C 

6

मैंने परियोजनाओं में वंशानुक्रम को हतोत्साहित करने वाले (पुस्तकालयों / ढाँचों के विपरीत) कई लेख पढ़े हैं, और कार्यक्रम के अंतःक्रियाओं को प्रोत्साहित करते हुए, कार्यान्वयनों के विरुद्ध नहीं।
वे रचना द्वारा OO की भी वकालत करते हैं: यदि आपको वर्ग a और b में कार्यों की आवश्यकता है, तो इस प्रकार के सदस्य / क्षेत्र बनाएं:

class C
{
    private $a, $b;

    public function __construct($x, $y)
    {
        $this->a = new A(42, $x);
        $this->b = new B($y);
    }

    protected function DoSomething()
    {
        $this->a->Act();
        $this->b->Do();
    }
}

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

3

एकाधिक विरासत इंटरफ़ेस स्तर पर काम करने लगता है। मैंने php 5.6.1 पर एक परीक्षण किया।

यहाँ एक काम कोड है:

<?php


interface Animal
{
    public function sayHello();
}


interface HairyThing
{
    public function plush();
}

interface Dog extends Animal, HairyThing
{
    public function bark();
}


class Puppy implements Dog
{
    public function bark()
    {
        echo "ouaf";
    }

    public function sayHello()
    {
        echo "hello";
    }

    public function plush()
    {
        echo "plush";
    }


}


echo PHP_VERSION; // 5.6.1
$o = new Puppy();
$o->bark();
$o->plush();
$o->sayHello(); // displays: 5.6.16ouafplushhello

मुझे नहीं लगता था कि यह संभव था, लेकिन मैंने स्विफ्टमेलर सोर्स कोड में स्विफ्ट_ट्रांसपोर्ट_ आईबोफर क्लास में ठोकर खाई, जिसकी निम्न परिभाषा है:

interface Swift_Transport_IoBuffer extends Swift_InputByteStream, Swift_OutputByteStream

मैं अभी तक इसके साथ नहीं खेला था, लेकिन मुझे लगा कि इसे साझा करना दिलचस्प हो सकता है।


1
दिलचस्प और अप्रासंगिक।
येवगेनी अफनासायेव

1

मैंने अभी अपनी "कई विरासत" समस्या को हल किया है:

class Session {
    public $username;
}

class MyServiceResponsetype {
    protected $only_avaliable_in_response;
}

class SessionResponse extends MyServiceResponsetype {
    /** has shared $only_avaliable_in_response */

    public $session;

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

}

इस तरह मेरे पास एक सत्र सत्र के अंदर सत्र में हेरफेर करने की शक्ति है जो MyServiceResponsetype का विस्तार करता है जो अभी भी सत्र को खुद से संभालने में सक्षम है।


1

यदि आप जांचना चाहते हैं कि क्या कोई फ़ंक्शन सार्वजनिक है तो इस विषय को देखें: https://stackoverflow.com/a/4160928/2226755

और कई या तर्कों के लिए call_user_func_array (...) विधि का उपयोग करें।

ऐशे ही :

class B {
    public function method_from_b($s) {
        echo $s;
    }
}

class C {
    public function method_from_c($l, $l1, $l2) {
        echo $l.$l1.$l2;
    }
}

class A extends B {
    private $c;

    public function __construct() {
        $this->c = new C;
    }

    public function __call($method, $args) {
        if (method_exists($this->c, $method)) {
            $reflection = new ReflectionMethod($this->c, $method);
            if (!$reflection->isPublic()) {
                throw new RuntimeException("Call to not public method ".get_class($this)."::$method()");
            }

            return call_user_func_array(array($this->c, $method), $args);
        } else {
            throw new RuntimeException("Call to undefined method ".get_class($this)."::$method()");
        }
    }
}


$a = new A;
$a->method_from_b("abc");
$a->method_from_c("d", "e", "f");

1

आप PHP में Traits का उपयोग करने में सक्षम हैं जो PHP 5.4 के रूप में घोषित किया गया है

यहाँ आपके लिए एक त्वरित ट्यूटोरियल है, http://culttt.com/2014/06/25/php-traits/


0

PHP अभी तक कई वर्ग विरासत का समर्थन नहीं करता है, लेकिन यह कई इंटरफ़ेस विरासत का समर्थन करता है।

कुछ उदाहरणों के लिए http://www.hudzilla.org/php/6_17_0.php देखें ।


फिर भी? मुझे संदेह है कि वे ऐसा करेंगे। आधुनिक OO कई वंशानुक्रम को हतोत्साहित करता है, यह गड़बड़ हो सकता है।
फीलो

0

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


0

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


0

हमेशा अच्छा विचार माता-पिता की कक्षा बनाना है, कार्यों के साथ ... अर्थात माता-पिता के लिए यह सभी कार्यक्षमता जोड़ें।

और उन सभी वर्गों को "स्थानांतरित" करें जो इस श्रेणीबद्ध रूप से नीचे का उपयोग करते हैं। मुझे जरूरत है - कार्यों को फिर से लिखने की, जो विशिष्ट हैं।


0

एक प्रोग्रामिंग भाषा के रूप में PHP की समस्याओं में से एक तथ्य यह है कि आप केवल एक ही विरासत हो सकते हैं। इसका मतलब है कि एक वर्ग केवल एक दूसरे वर्ग से विरासत में मिल सकता है।

हालांकि, कई बार यह कई वर्गों से विरासत में लेने के लिए फायदेमंद होगा। उदाहरण के लिए, कोड दोहराव को रोकने के लिए अलग-अलग वर्गों के एक जोड़े से विरासत के तरीकों के लिए यह वांछनीय हो सकता है।

यह समस्या उस वर्ग को जन्म दे सकती है जिसमें वंशानुक्रम का एक लंबा पारिवारिक इतिहास है जो अक्सर समझ में नहीं आता है।

PHP 5.4 में भाषा की एक नई विशेषता को ट्रेट्स के रूप में जाना गया। एक Trait एक Mixin की तरह है कि यह आपको एक मौजूदा वर्ग में Trait कक्षाएं मिलाने की अनुमति देता है। इसका अर्थ है कि आप कोड अनुलिपि को कम कर सकते हैं और एकाधिक विरासत की समस्याओं से बचने के दौरान लाभ प्राप्त कर सकते हैं।

लक्षण


-1

यह वास्तविक उत्तर नहीं है, हमारे पास डुप्लीकेट क्लास है

... लेकिन यह काम करता है :)

class A {
    //do some things
}

class B {
    //do some things
}

class copy_B सभी क्लास B की कॉपी है

class copy_B extends A {

    //do some things (copy class B)
}

class A_B extends copy_B{}

अभी

class C_A extends A{}
class C_B extends B{}
class C_A_b extends A_B{}  //extends A & B

-3

क्लास ए का विस्तार {{

वर्ग B का विस्तार C {}

तब A ने B और C दोनों को बढ़ाया है


2
@rostamiani क्योंकि यह विधि भी वर्ग को संशोधित कर रही है B। क्या हम समय के सबसे अधिक चाहते हैं दो असंबंधित वर्गों है Bऔर C(शायद अलग पुस्तकालयों से) और साथ ही साथ द्वारा विरासत में मिली हो A, ऐसा है कि Aदोनों से सब कुछ शामिल है Bऔर Cहै, लेकिन Bसे कुछ भी शामिल नहीं है Cविपरीत और उपाध्यक्ष।
SOFe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.