2014-12-02 1 views
0

У меня есть внешний класс, который имеет другой класс в качестве члена (следуя основному составу над наследованием). Теперь мне нужно вызвать метод внешнего класса из класса внутри.Класс композиции - вызов внешнего метода из внутреннего класса

class Outer 
{ 
    var $inner; 
    __construct(Inner $inner) { 
     $this->inner = $inner; 
    } 
    function outerMethod(); 
} 
class Inner 
{ 
    function innerMethod(){ 
// here I need to call outerMethod() 
    } 
} 

Я вижу, как решение, чтобы добавить ссылку в Outer :: __ конструкция:

$this->inner->outer = $this; 

Это позволяет мне называть внешний метод, как это в Inner :: innerMethod:

$this->outer->outerMethod(); 

Это хорошее решение или есть лучшая альтернатива?

+0

Есть ли конкретная причина для внутреннего класса, вызывающего внешний? Почему бы не вызвать вызов внешнего метода с внутренним параметром, чтобы не создавать циклические зависимости? –

+0

Причина: внутренний класс является специализацией внешнего. Существует несколько возможных классов, которые реализуют InnerInterface. Внешний класс содержит неизменные методы, а внутренний класс содержит специальные методы специализации. –

ответ

1

Лучше всего было бы включить внешний класс в качестве переменной-члена внутренней.

E.g.

class Inner 
{ 
    private $outer; 
    function __construct(Outer $outer) { 
     $this->outer= $outer; 
    } 
    function innerMethod(){ 
// here I need to call outerMethod() 
     $this->outer->outerMethod(); 
    } 
} 

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

E.g.

class Outer 
{ 
    private $inner; 
    function __construct(Inner $inner) { 
     $inner->setOuter($this); 
     $this->inner = $inner; 
    } 
    function outerMethod(); 
} 

class Inner 
{ 
    private $outer; 
    function setOuter(Outer $outer) { 
     $this->outer= $outer; 
    } 
    function innerMethod(){ 
// here I need to call outerMethod() 
     $this->outer->outerMethod(); 
    } 
} 

Примечание: var в качестве спецификации в качестве membed переменного типа является устаревшим. Используйте вместо этого public, protected или private. Совет - ошибайтесь на стороне частного, если у вас нет причин.