ฉันสามารถขยายคลาสโดยใช้มากกว่า 1 คลาสใน PHP ได้หรือไม่?


150

หากฉันมีหลายคลาสที่มีฟังก์ชั่นที่ฉันต้องการ แต่ต้องการจัดเก็บแยกต่างหากสำหรับองค์กรฉันสามารถขยายคลาสให้มีทั้งสองได้หรือไม่

กล่าวคือ class a extends b extends c

แก้ไข: ฉันรู้วิธีการขยายชั้นเรียนทีละครั้ง แต่ฉันกำลังมองหาวิธีการขยายชั้นเรียนโดยใช้คลาสพื้นฐานหลายชั้นทันที - AFAIK คุณไม่สามารถทำสิ่งนี้ใน PHP ได้ แต่ควรมีวิธีแก้ไขโดยไม่ต้องหันมาใช้class c extends b,class b extends a


ใช้การรวมหรืออินเทอร์เฟซ ไม่มีการสืบทอดหลายรายการใน PHP
Franck

2
ฉันกำลังมองหาอินเตอร์เฟสเนื่องจากฉันไม่ใช่แฟนตัวยงของลำดับชั้นขนาดใหญ่ แต่ฉันไม่เห็นว่าอินเตอร์เฟสทำอะไรได้จริง?
atomicharri

ส่วนต่อประสานช่วยให้คุณ "รับช่วง" API เท่านั้นไม่ใช่ส่วนของฟังก์ชัน มันบังคับให้คลาส a ใช้วิธีจากอินเตอร์เฟส b และ c หมายความว่าถ้าคุณต้องการสืบทอดพฤติกรรมคุณต้องรวมวัตถุสมาชิกของคลาส b และ c ในคลาสของคุณ
Franck

2
พิจารณาใช้ Decorators sourcemaking.com/design_patterns/decoratorหรือกลยุทธ์sourcemaking.com/design_patterns/strategy
Gordon

2
โปรดพิจารณาคุณสมบัติเป็นคำตอบที่ถูกต้อง
Daniel

คำตอบ:


170

ตอบการแก้ไขของคุณ:

หากคุณต้องการปลอมมรดกหลายรายการจริงๆคุณสามารถใช้ฟังก์ชั่นเวทย์มนตร์ __call ()

สิ่งนี้น่าเกลียดแม้ว่าจะได้ผลจากมุมมองของผู้ใช้คลาส A:

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");

พิมพ์ "abcdef"


1
จริง ๆ แล้วฉันชอบความคิดในการขยายชั้นเรียนมีข้อ จำกัด ที่รู้จักในการทำเช่นนี้หรือไม่?
atomicharri

3
ไม่มีข้อ จำกัด เท่าที่ฉันรู้ PHP เป็นภาษาที่อนุญาตมากสำหรับการแฮ็กเล็กน้อยเช่นนี้ :) ตามที่คนอื่น ๆ ได้ชี้ให้เห็นมันไม่ใช่วิธีการที่เหมาะสมในการทำ OOP
Franck

64
คุณจะไม่สามารถใช้วิธีการป้องกันหรือส่วนตัว
Wormhit

1
@wormhit แม้ว่าฉันจะไม่แนะนำให้ใช้ในการผลิต แต่อย่างใดสามารถใช้ ReflectionClass เพื่อเข้าถึงวิธีการส่วนตัวและการป้องกัน
เดนิส V

2
สิ่งนี้จะใช้ไม่ได้กับการดำเนินการซึ่งคาดว่าจะมีวิธีการใช้งานจริงและลักษณะการทำงานนั้นไม่ได้กำหนดไว้อย่างชัดเจนเมื่อคลาสพื้นฐานหลายคลาสมีเมธอดที่มีชื่อเหมือนกัน นอกจากนี้ยังจะทำให้ความสามารถในการแก้ไขของคุณไม่ชัดเจนเพื่อให้คำแนะนำแก่คุณ
Erik

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

และอื่น ๆ


คุณช่วยอธิบายได้ไหมว่าทำไมการสืบทอดนางพยาบาลให้เป็นแม่บ้านเป็นครั้งแรกจากนั้นจึงประกาศการสืบทอด HumanEntity เป็นนางพยาบาล?
Qwerty

7
@Qwerty เพราะ Matron มีคุณสมบัติเพิ่มเติมของพยาบาลในขณะที่พยาบาลมีคุณสมบัติทั้งหมดของมนุษย์ ดังนั้น Matron เป็นพยาบาลมนุษย์และในที่สุดก็มีความสามารถ Matron
J-Dizzle

58

คุณสามารถใช้คุณลักษณะซึ่งหวังว่าจะมีให้ใน PHP 5.4

ลักษณะเป็นกลไกสำหรับการใช้รหัสซ้ำในภาษาที่สืบทอดเดียวเช่น PHP ลักษณะนิสัยมีจุดประสงค์เพื่อลดข้อ จำกัด บางประการของการสืบทอดเดี่ยวโดยทำให้นักพัฒนาสามารถนำชุดวิธีการมาใช้ใหม่ได้อย่างอิสระในชั้นเรียนอิสระหลายแห่งที่อาศัยอยู่ในลำดับชั้นของชั้นเรียนที่แตกต่างกัน ความหมายของการรวมกันของลักษณะและชั้นเรียนที่กำหนดไว้ในลักษณะที่ช่วยลดความซับซ้อนและหลีกเลี่ยงปัญหาทั่วไปที่เกี่ยวข้องกับการสืบทอดหลายและ Mixins

พวกเขาได้รับการยอมรับสำหรับศักยภาพในการสนับสนุนการจัดองค์ประกอบที่ดีขึ้นและนำมาใช้ใหม่ดังนั้นการรวมเข้ากับภาษาเวอร์ชันใหม่เช่น Perl 6, Squeak, Scala, Slate และ Fortress คุณสมบัติยังได้รับการพอร์ตไปยัง Java และ C #

ข้อมูลเพิ่มเติม: https://wiki.php.net/rfc/traits


ตรวจสอบให้แน่ใจว่าจะไม่ละเมิดพวกเขา โดยพื้นฐานแล้วมันเป็นฟังก์ชั่นคงที่ที่คุณใช้กับวัตถุ คุณสามารถสร้างระเบียบโดยใช้พวกเขา
Nikola Petkanski

2
ฉันไม่อยากจะเชื่อเลยว่านี่ไม่ใช่คำตอบที่เลือก
Daniel

18

คลาสไม่ได้มีไว้เพื่อเป็นเพียงคอลเลกชันของวิธีการ คลาสควรจะแสดงแนวคิดที่เป็นนามธรรมโดยมีทั้งสถานะ (เขตข้อมูล) และพฤติกรรม (เมธอด) ที่เปลี่ยนสถานะ การใช้การสืบทอดเพียงเพื่อให้ได้พฤติกรรมที่ต้องการดูเหมือนว่าการออกแบบ OO ที่ไม่ดีและแน่นอนว่าทำไมหลาย ๆ ภาษาไม่อนุญาตให้มีการสืบทอดหลาย ๆ ครั้ง: เพื่อป้องกัน "การถ่ายทอดทางปาเก็ตตี้" เช่นการขยาย 3 ชั้นเพราะแต่ละวิธีมีวิธีที่คุณต้องการ คลาสที่รับเมธอด 100 และ 20 เขตข้อมูล แต่จะใช้เพียง 5 วิธีเท่านั้น


1
ฉันจะมีปัญหากับการยืนยันของคุณว่าคำขอของ OP ถือเป็น "การออกแบบ OO ที่ไม่ดี" ; เพียงแค่ดูการเกิดขึ้นของMixinsเพื่อสนับสนุนตำแหน่งที่เพิ่มในวิธีการเรียนจากหลายแหล่งเป็นความคิดที่ดีในเชิงสถาปัตยกรรม อย่างไรก็ตามฉันจะให้คุณทราบว่า PHP ไม่ได้จัดเตรียมชุดคุณสมบัติภาษาที่เหมาะสมที่สุดเพื่อให้ได้ "การออกแบบ" ที่ดีที่สุด แต่ไม่ได้หมายความว่าการใช้คุณสมบัติที่มีให้โดยประมาณนั้นเป็นแนวคิดที่ไม่ดี เพียงแค่ดูคำตอบของ @ Franck
MikeSchinkel

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 OtherClass จำเป็นต้องมีฟังก์ชั่นสาธารณะที่เรียกว่า "setExtendee" เพื่อตั้งค่าความสัมพันธ์นี้ จากนั้นหากมีการเรียกใช้เมธอดจาก $ 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
Nishchal Gautam

ทำไมไม่ใช้คุณลักษณะBusinessWomanแทนBusinessPerson? จากนั้นคุณสามารถมีหลายมรดกที่แท้จริง
SOFe

@ SOFe เนื่องจากนักธุรกิจยังสามารถขยายได้ ดังนั้นผู้ที่ทำธุรกิจสามารถขยายธุรกิจคนได้และรับลักษณะโดยอัตโนมัติ
อลิซ

วิธีที่คุณทำสิ่งนี้ไม่แตกต่างจากสิ่งที่เป็นไปได้ในการสืบทอดเดี่ยวที่ BusinessPerson ขยายคลาสนามธรรมที่เรียกว่ามนุษย์ ประเด็นของฉันคือตัวอย่างของคุณไม่ต้องการมรดกหลายอย่าง
SOFe

ฉันเชื่อจนกระทั่ง BusinessPerson จำเป็นต้องใช้ BusinessWoman จะได้รับคุณสมบัติอื่น ๆ โดยตรง แต่สิ่งที่ฉันลองที่นี่คือรักษาลักษณะทั้งสองไว้ในระดับคนกลางแล้วใช้ตามที่ต้องการ ดังนั้นที่ฉันสามารถลืมเกี่ยวกับการรวมทั้งลักษณะถ้าจำเป็นอีกบางที่อื่น (ตามที่ฉันอธิบาย BusinessMan) มันคือทั้งหมดที่เกี่ยวกับรูปแบบรหัส หากคุณต้องการที่จะรวมโดยตรงกับชั้นเรียนของคุณ คุณสามารถไปข้างหน้าด้วยสิ่งนั้น - ในขณะที่คุณพูดถูก
อลิซ

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
คำตอบของคุณควรมีคำอธิบายรหัสของคุณและคำอธิบายวิธีแก้ไขปัญหา
AbcAeffchen

1
มันเกือบจะเป็นคำอธิบายตัวเอง แต่ก็เป็นการดีถ้ามีความคิดเห็นตามรหัส
Heroselohim

ตอนนี้ถ้าทั้ง Ext1 และ Ext2 มีฟังก์ชั่นที่มีชื่อเดียวกันเสมอจะเรียกว่า Ext1 cwill มันจะไม่ขึ้นอยู่กับพารามิเตอร์เลย
อลิซ

8

คำตอบที่ได้รับการยอมรับในปัจจุบันโดย @Franck จะใช้งานได้ แต่ไม่ใช่ในความเป็นจริงหลายมรดก แต่อินสแตนซ์ย่อยของคลาสที่กำหนดไว้นอกขอบเขตยังมี__call()ชวเลข $this->childInstance->method(args)ทุกที่ที่คุณต้องการ

คำตอบที่แน่นอน

ไม่คุณไม่สามารถตามลำดับไม่ได้จริงๆตามที่ใช้extendsคำหลักบอกว่า:

คลาสที่ขยายเพิ่มขึ้นอยู่กับคลาสพื้นฐานเดียวเสมอนั่นคือไม่รองรับการสืบทอดหลายรายการ

คำตอบที่แท้จริง

อย่างไรก็ตามตามที่ @adam แนะนำอย่างถูกต้องสิ่งนี้ไม่ได้เป็นการห้ามไม่ให้คุณใช้การสืบทอดลำดับชั้นหลายครั้ง

คุณสามารถขยายชั้นเรียนหนึ่งไปอีกชั้นหนึ่งด้วยอีกชั้นหนึ่ง ...

ตัวอย่างง่ายๆในเรื่องนี้คือ:

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

โน๊ตสำคัญ

ตามที่คุณอาจสังเกตเห็นคุณสามารถทำ intehritance หลาย (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

ฉันได้อ่านบทความหลายฉบับที่ทำให้หมดกำลังใจในโครงการ (เมื่อเทียบกับไลบรารี่ / กรอบงาน) และกระตุ้นให้โปรแกรมอินเทอร์เฟซ agaisnt ไม่ต่อต้านการใช้งาน
พวกเขายังสนับสนุน OO โดยการจัดองค์ประกอบ: หากคุณต้องการฟังก์ชั่นในชั้นเรียน a และ b, ทำให้ c มีสมาชิก / สาขาประเภทนี้:

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();
    }
}

สิ่งนี้จะกลายเป็นสิ่งเดียวกันกับที่ Franck และ Sam แสดง แน่นอนถ้าคุณเลือกที่จะใช้อย่างชัดเจนองค์ประกอบคุณควรจะใช้ฉีดพึ่งพา
MikeSchinkel

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

ฉันไม่คิดว่าเป็นไปได้ แต่ฉันสะดุดในซอร์สโค้ด SwiftMailer ในคลาส Swift_Transport_IoBuffer ซึ่งมีคำจำกัดความต่อไปนี้:

interface Swift_Transport_IoBuffer extends Swift_InputByteStream, Swift_OutputByteStream

ฉันยังไม่ได้เล่น แต่ฉันคิดว่ามันน่าสนใจที่จะแชร์


1
ที่น่าสนใจและไม่เกี่ยวข้อง
Yevgeniy Afanasyev

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;
    }

}

วิธีนี้ฉันมีอำนาจในการจัดการเซสชันภายใน SessionResponse ซึ่งขยาย 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");


0

PHP ยังไม่รองรับการสืบทอดหลายคลาส แต่รองรับการสืบทอดหลายอินเตอร์เฟส

ดูhttp://www.hudzilla.org/php/6_17_0.phpสำหรับตัวอย่าง


ยัง? ฉันสงสัยว่าพวกเขาจะทำ โมเดิร์น OO ท้อมรดกหลายมันอาจจะยุ่ง
PhiLho

0

PHP ไม่อนุญาตให้มีการสืบทอดหลายอย่าง แต่คุณสามารถทำได้ด้วยการใช้หลายอินเตอร์เฟส หากการใช้งานนั้น "หนัก" ให้จัดทำโครงร่างสำหรับแต่ละอินเตอร์เฟสในคลาสที่แยกต่างหาก จากนั้นคุณสามารถมอบหมายระดับอินเตอร์เฟซที่ใช้งานทั้งหมดเพื่อให้โครงกระดูกเหล่านี้ผ่านทางวัตถุที่บรรจุ


0

ไม่ทราบแน่ชัดว่าคุณกำลังพยายามทำอะไรฉันขอแนะนำให้มองถึงความเป็นไปได้ในการออกแบบแอปพลิเคชันของคุณใหม่ให้ใช้องค์ประกอบแทนที่จะเป็นมรดกในกรณีนี้


0

ความคิดที่ดีเสมอคือการสร้างคลาสผู้ปกครองด้วยฟังก์ชั่น ... เช่นเพิ่มฟังก์ชั่นทั้งหมดนี้ให้กับผู้ปกครอง

และ "ย้าย" คลาสทั้งหมดที่ใช้ลำดับชั้นนี้ลง ฉันต้องการ - เขียนฟังก์ชันใหม่ซึ่งเฉพาะเจาะจง


0

หนึ่งในปัญหาของ PHP ในการเขียนโปรแกรมภาษาคือความจริงที่ว่าคุณสามารถมีมรดกได้เพียงครั้งเดียว นี่หมายความว่าคลาสสามารถสืบทอดจากคลาสอื่นเท่านั้น

อย่างไรก็ตามมีเวลามากที่จะเป็นประโยชน์ในการสืบทอดจากหลายคลาส ตัวอย่างเช่นอาจเป็นการดีที่จะสืบทอดเมธอดจากคลาสที่ต่างกันสองคลาสเพื่อป้องกันการทำซ้ำโค้ด

ปัญหานี้อาจนำไปสู่ชั้นเรียนที่มีประวัติครอบครัวที่สืบทอดมายาวนานซึ่งมักไม่สมเหตุสมผล

ใน PHP 5.4 มีการเพิ่มคุณสมบัติใหม่ของภาษาซึ่งเรียกว่า Traits ลักษณะเป็นเหมือน 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

คลาส A ขยาย B {}

คลาส B ขยาย C {}

จากนั้น A ได้ขยายทั้ง B และ C


2
@rostamiani Bชั้นเพราะวิธีการนี้นอกจากนี้ยังมีการปรับเปลี่ยน สิ่งที่เราต้องการส่วนใหญ่คือการมีสองคลาสที่ไม่เกี่ยวข้องBและC(อาจมาจากห้องสมุดที่แตกต่างกัน) และรับพร้อมกันโดยAเช่นนั้นAมีทุกอย่างจากทั้งสองBและCแต่Bไม่ประกอบด้วยอะไรจากCและในทางกลับกัน
SOFe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.