2010-05-12 112 views
4

可以说我有一个父类有没有什么办法可以在php中实现多重继承?

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 = new parent; $ objparent - > foo();

+1

最基本的问题是你有倒退。孩子们延长他们的父母,而不是相反。 – deceze 2010-05-12 01:40:58

回答

2

不,但多重继承通常被认为是不好的做法。你应该喜欢构图,所以你只需要在你的类中使用你想要继承的类的实例。

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

UPDATE:

您将需要为每个类,你可能需要使用方法的一种方法 - 这就是所谓的外观设计模式。或者,也许你不知道,你可以这样调用内部对象的方法:

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

Facade模式:

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

你的情况门面

不会比创建一个类别的并定义您想要使用的每一种方法,并在该方法内调用任何内部实例的任何方法。但我真的没有看到任何好处,而不是调用 分层次的实例和方法

+0

你是说通过创建单独的对象分别执行不同类的方法? – Starx 2010-05-12 01:23:22

+0

我不确定你的问题是什么,因为你的问题不是很具体。但我说你应该在你的父对象内部创建你所谓的子类的实例,并根据需要调用方法。如果没有你更好地解释你的问题,我不认为我可以更有用 – marianboda 2010-05-12 01:28:40

+0

所有的子类和实际上组成大类的部分就像一个“网页”包含“头”,“身体”和身体包含横幅,内容,页脚,并且横幅包含flashheader,菜单栏。我试图创建一个网页类的实例,并试图显示整个网页在一个击打 – Starx 2010-05-12 01:33:37

2

好像你真的很困惑面向对象。

父级没有意识到其子女。如果你想执行一个子类,你需要创建它的实例。

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

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

+0

+1同意 - “你可以使用实现多个接口来强制子类有一套所需的方法” – falomir 2010-05-12 01:25:32

+0

但我想执行所有方法使用父类的一个实例 – Starx 2010-05-12 01:28:27

+1

@starx,对不起,队友,这是不可能的。发明自己的语言:D – iBiryukov 2010-05-12 01:31:33

1

你在做什么是真的倒退。继承用于在没有代码重复的情况下为对象提供通用的共享功能。继承从父母到孩子,父母可以做的所有事情,孩子可以做得很好,但它可以做得更多(扩展了父母的功能)。

class Parent { 

    function everyoneCanDoThis() { } 

} 


class Child extends Parent { 

    // I can implicitly use the everyoneCanDoThis() function 

    function onlyChildrenCanDoThis() { } 

} 

由于这是一种自顶向下的结构,所以父母不应该依赖任何特定的孩子。父母不执行或调用孩子的功能。只有调用Child的函数,但是这些函数可以从Parent类继承。

你应该把你想要的每个对象的所有东西都放在Parent类中。只与特定对象相关的特定功能进入Child。

的多重继承是不同的CAN蠕虫是不可能在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没有任何功能本身,继承或其他方式。但它拥有两个其他对象,每个对象都具有一些功能。在“零件”的功能可以被直接暴露,所以它们被称为像$composedObject->part1->doSomeTask(),它们可以被封装作为例子,所以它们被称为像$composedObject->doTask(),并在内部授权,或者你可以使用一些__call() trickery自动委托函数在组合对象上调用它的一个“部分”。尽管如此,这与多重继承有同样的问题。如果两个“零件”都包含一个同名的方法,你打电话给哪一个?

+0

你能解释一下关于作文的一点点吗? – Starx 2010-05-12 01:58:41

+0

@Starx我说过后来回来哦,哦......; o)更新了一个作文的例子。 – deceze 2010-05-12 03:44:08

0

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

当你从父母继承,你得到它,除非你选择覆盖一切的东西,再加上你可以通过添加额外的更具体的东西延伸,但家长不应该知道孩子什么。

当你实现一个接口时,接口定义了方法,但是它并没有实现它们。这取决于你实施它。不同的类可以实现接口方法,只要他们遵循接口说的话。

继承往往被过度使用,并导致不好的方案。也许如果你告诉我们你想要解决什么问题,我们其中一个人可以建议你如何构建你的课程。

0

在Php中使用接口也许可以解决问题。

1

+1给其他人。你真的有倒退。孩子总是扩大他们的父母。

但有一些甚至可以在PHP行为有点像多重继承:修饰模式。 我写了一篇关于它的文章on my blog here

相关问题