4

假设我有一个父类

class parent { }

.....

这个父类有三个子类

class child1 { }

class child2 { }

class child3 { }

这些子类还有更小的部分,比如

class child1subpar1 { }

class child1subpar2 {

       public function foo() {
          echo "hi";
       }

}

class child2subpar1 { }

class child2subpar2 { }

现在,如何总结这一切

class child1 extends child1subpar1, child1subpar2 { }
class child2 extends child2subpar1, childsubpar1 { }

class parent extends child1,child2,child3 { }

我需要执行其继承类中的方法并执行类似的操作

$objparent = 新父级;$objparent -> foo();

4

6 回答 6

2

不,但是多重继承通常被认为是一种不好的做法。相反,您应该更喜欢组合,因此您只需使用要在类中继承的类的实例。

现在,当我再次查看您的问题时,它甚至不是继承问题,您应该使用组合。也许如果您提供了更多您期望该课程做什么的详细信息,我们应该更准确地回答。

更新:

您将需要为您想要使用的每个类的方法创建一个方法 - 它称为外观设计模式。或者你可能不知道你可以像这样调用内部对象的方法:

$parent->subObject->subSubObject->wantedMethod();

立面图案:

http://en.wikipedia.org/wiki/Facade_pattern

在您的情况下,外观除了创建一个类并定义您要使用的每一个方法,并在该方法内部调用您的任何内部实例的任何方法外,别无他法。但是我真的没有看到任何好处,而不是分层调用实例和方法

于 2010-05-12T01:21:33.553 回答
2

似乎您对 OOP 真的很困惑。

父类不知道它的子类。如果你想执行一个子类,你需要创建它的实例。

PHP(以及许多其他流行语言,如 Java)中也不允许多重继承。

可能值得关注聚合 - 将较小的子类传递给子类或事件父类。此外,您可以使用实现多个接口来强制子类具有一组必需的方法。

于 2010-05-12T01:22:34.687 回答
1

你正在做的事情真的是倒退。继承用于在不重复代码的情况下赋予对象通用的共享功能。继承从父级到子级,父级可以做的所有事情,子级也可以做,但它可能会做更多(它扩展了父级的功能)。

class Parent {

    function everyoneCanDoThis() { }

}


class Child extends Parent {

    // I can implicitly use the everyoneCanDoThis() function

    function onlyChildrenCanDoThis() { }

}

由于这是一个自上而下的结构,因此 Parent 不应依赖任何特定的 Child。Parent 不执行或调用 Child 的函数。只有调用 Child 的函数,但这些函数可能继承自 Parent 类。

您应该将希望每个对象能够执行的所有操作都放在 Parent 类中。仅与特定对象相关的特定功能进入子级。

多重继承是一种不同的蠕虫,在 PHP 中是不可能的,这是有充分理由的。当你了解了继承的基础知识后,回到组合,正如这里其他地方所建议的那样。:)


组合只是意味着您获取多个对象并将对它们的引用保存在另一个对象中。它与继承无关,因为这些对象中的每一个都可能从父类继承,也可能不继承,它们仍然是单独的对象。

class ComposedObject {

    private $part1 = null;
    private $part2 = null;

    public function __constructor() {
        $this->part1 = new Part1();
        $this->part2 = new Part2();
    }

    public function doTask() {
        return $this->part1->doSomeTask();
    }

    public function doOtherTask() {
        return $this->part2->doSomeOtherTask();
    }

}

ComposedObject 本身没有任何功能,无论是继承的还是其他的。但它拥有另外两个对象,每个对象都带有一些功能。“部分”中的功能可以直接公开,因此它们被称为 like $composedObject->part1->doSomeTask(),它们可能像示例中一样被封装,因此它们被称为 like$composedObject->doTask()并且是内部委托的,或者您可以使用一些__call()技巧来自动委托调用的函数组合对象到它的“部分”之一。不过,这与多重继承有同样的问题;如果两个“部分”都包含同名的方法,你叫哪一个?

于 2010-05-12T01:53:27.180 回答
1

+1 给其他人。你真的把它弄反了。孩子总是延伸他们的父母。

但甚至还有一些类似于 PHP 中的多重继承的东西:装饰器模式。我在我的博客上写了一篇关于它的文章。

于 2010-05-12T03:55:39.747 回答
0

在 PHP 中使用接口也许可以解决这个问题。

于 2010-05-12T03:52:16.943 回答
0

一个类可以实现多个接口,这是一个稍微不同的事情。

当您从父母那里继承时,您会得到它所拥有的一切,除非您选择覆盖某些东西,而且您可以通过添加更多更具体的东西来扩展它,但父母不应该知道关于孩子的任何事情。

当你实现一个接口时,接口定义了方法,但它没有实现它们。由您来实施它。不同的类可以实现他们想要的接口方法,只要他们遵循接口所说的。

继承往往被过度使用并导致糟糕的程序。也许如果您告诉我们您要解决什么问题,我们中的一位可能会建议您如何构建您的课程。

于 2010-05-12T02:36:54.070 回答