【问题标题】:Inheritance from more than one class [duplicate]从多个类继承[重复]
【发布时间】:2012-06-17 13:21:42
【问题描述】:

可能重复:
Is Multiple Inheritance allowed at class level in PHP?

我该如何解决这个问题

<?php
class A {
    public function af() {
        print 'a';
    }
    public function bark() {
        print ' arf!';
    }
}

class B {
    public function bf() {
        print 'b';
    }
}

class C extends B, A /*illegal*/ {
    public function cf() {
        print 'c';
    }

    public function bark() {
        print ' ahem...'; 
        parent::bark();
    }
}
    
$c = new C; 
$c->af(); 
$c->bf(); 
$c->cf();
print "<br />";
$c->bark();
//Parse Error
?>

【问题讨论】:

标签: php oop multiple-inheritance


【解决方案1】:

不能,PHP 不支持多重继承。您可以使A 继承自B,反之亦然;或者您可以在C 中包装AB 的其他实例,并根据需要对它们进行代理方法调用:

class C {
    protected $a, $b;
    function __construct(A $a, B $b) {
        $this->a = $a;
        $this->b = $b;
    }
    function af() {
        return $this->a->af();
    }
    function bf() {
        return $this->b->bf();
    }
    // ... etc...
}

(现在使用依赖注入来安抚 OOP 纯粹主义者)

【讨论】:

  • 特征可能是一个更好的主意,但我喜欢你的主意,
  • Traits 一个更好的主意,如果你可以指望 PHP 5.4 可用的话。
  • 这实际上是糟糕的 OO,因为您使一个对象直接依赖于其他 2 个对象。你只是希望他们在那里。依赖注入会更好。 @Truth 而特质几乎总是糟糕设计的标志。
  • @w00:嘘。那么,你误解了特征——它们与设计几乎没有关系。它们是关于实施。他们清理代码。我认为它们比让十几个类以稍微不同的方式做同样的事情更好,或者有十几个方法的唯一目的是代理一些实际完成工作的私有对象,或者必须将方法放在三个层次上在继承树中,从而使十几个其他类在对它们没有意义时继承该功能。
  • @cHao Psh。不,这只是糟糕的设计。与其使用特征将代码破解到类中,不如通过构造函数或设置器(通过接口)传递依赖项。这样,您的课程就不会与特征硬耦合。这样,您仍然可以遵守 Open/Close 原则(SOLID 设计)。因此,如果需要,可以使用版本化的 API。但是,如果您认为 Traits 有用,请做我的客人并使用它们。
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 2013-05-19
  • 2017-11-25
  • 2012-06-23
  • 2014-07-14
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
相关资源
最近更新 更多