2010-05-12 1 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

ответ

2

Нет, но множественное наследование обычно считается плохой практикой. Вместо этого вы должны использовать композицию, поэтому вы просто используете экземпляры классов, которые вы хотели наследовать внутри своего класса.

И теперь, когда я снова заглядываю в ваш вопрос, это даже не проблема наследования, вы должны использовать композицию. Возможно, если вы предоставите более подробную информацию о том, что вы ожидаете от этого класса, мы должны ответить более точно.

UPDATE:

Вам нужно будет создать один метод для каждого метода этих классов, которые вы хотели бы использовать - это называется Фасад шаблон дизайна. Или, может быть, вы не знаете, что вы можете вызывать методы внутренних объектов, как это:

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

Фасад картина:

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

в вашем случае фасад не будет ничего другого, чем создание одного класса и определить каждый метод, который вы хотите использовать, и внутри этого метода вызывать любой метод любого из ваших внутренних экземпляров. Но я действительно не вижу никакой пользы от этого, вместо того, чтобы называть экземпляры и методы иерархически

+0

Вы хотите сказать, что выполняйте методы разных классов отдельно, создавая отдельные объекты? – Starx

+0

Я не уверен, в чем ваша проблема, потому что ваш вопрос не очень конкретный. Но я говорю, что вы должны создавать экземпляры того, что вы называете подклассами внутри вашего родительского объекта, и вызывать методы по мере необходимости.Я не думаю, что я могу быть более полезным без вас, более подробно объясняя вашу проблему – marianboda

+0

все подклассы и фактически часть, которые составляют более крупный класс, так же как «веб-страница» содержит «голова», «тело» и тело содержит баннер, контент, нижний колонтитул , а баннер содержит flashheader, меню. И я пытаюсь создать экземпляр класса веб-страницы и попытаться показать всю веб-страницу за один удар. – Starx

2

Похоже, вы действительно смущены ООП.

Родительский класс не осознает своих детей. Если вы хотите выполнить дочерний класс, вам нужно создать его экземпляр.

Множественное наследование также не допускается в PHP (как и многие другие популярные языки, такие как Java).

Возможно, стоит обратить внимание на агрегацию - передача меньших подклассов в родительский класс ребенка или события. Кроме того, вы можете использовать различные интерфейсы, чтобы заставить подклассы иметь набор необходимых методов.

+0

+1 Согласен - «вы можете использовать различные интерфейсы реализации, чтобы заставить подклассы иметь набор необходимых методов» – falomir

+0

, но я хочу выполнить все методы, используя один экземпляр родительского класса – Starx

+1

@starx, извините, это невозможно. Придумайте свой собственный язык: D – iBiryukov

1

Что вы делаете, это действительно наоборот. Наследование используется для предоставления общих, общих функций для объектов без дублирования кода. Наследование происходит от родительского к ребенку, все, что может сделать родитель, ребенок может также делать, но он может делать больше (он расширяет функциональность родителя).

class Parent { 

    function everyoneCanDoThis() { } 

} 


class Child extends Parent { 

    // I can implicitly use the everyoneCanDoThis() function 

    function onlyChildrenCanDoThis() { } 

} 

Поскольку это структура сверху вниз, родитель не должен полагаться на какого-либо конкретного Ребенка. Родитель не выполняет или не вызывает функции Ребенка. Только вы вызывают функции ребенка, но эти функции могут быть унаследованы от класса родителя.

Вы должны поместить все, что хотите, чтобы каждый объект мог быть в классе родителя. Специфическая функциональность, относящаяся только к конкретному объекту, переходит в Ребенка.

Множественное наследование - это различная возможность червей, которая невозможна на PHP, по уважительным причинам. Вернитесь к композиции, как это предлагается в другом месте здесь, когда вы получаете основы наследования. :)


Композиция означает, что вы берете несколько объектов и держите ссылки на них в другом объекте. Это не имеет ничего общего с наследованием, поскольку каждый из этих объектов может или не может наследоваться от класса Parent, и они все еще являются отдельными объектами.

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

+0

@Starx Я сказал, вернусь позже, о хорошо ...; o) Обновлен с примером композиции. – deceze

0

Класс может реализовывать более одного интерфейса, что несколько отличается.

Когда вы наследуете родителя, вы получаете все, что у него есть, если вы не решите переопределить что-либо, плюс вы можете расширить его, добавив дополнительные более конкретные вещи, но родитель не должен ничего знать о ребенке.

При реализации интерфейса интерфейс определяет методы, но не реализует их. Это зависит от вас, чтобы реализовать его. Различные классы могут реализовать методы интерфейса, но они хотят, пока они следуют тому, что говорит интерфейс.

Наследование имеет тенденцию быть чрезмерным и ведет к плохим программам. Возможно, если вы сообщите нам, какую проблему вы пытаетесь решить, один из нас может предложить, как вы можете структурировать свои классы.

0

Использование интерфейса в Php может решить вопрос.

1

+1 другим. У вас действительно есть это в обратном направлении. Дети ВСЕГДА расширяют своих родителей.

Но есть даже что-то, что может действовать как множественное наследование в PHP: Pattern Decorator. Я написал статью об этом on my blog here.