Наследование классов

Demiurg

Guest
Во втором случае имеет смысл использовать агрегацию :)
 

Crazy

Developer
Автор оригинала: Varg
a::foo()
Иногда для работы методы не требуются значения атрибутов объекта. В этом случае можно обращаться к нему даже не имея экземпляра объекта. Синтаксис ты привел.

И что есть Делегирование и агрегация?
Если происходит обращение к методу объекта A, а тот в свою очередь вызывает другой метод объекта B, то это делегирование.

Если объект B живет внутри объекта A и его время жизни целиком укладывается во время жизни объекта A, то это агрегация.

Как используются агрегация и делегирование для множественного наследования реализации в PHP:

1. Класс-"потомок" агрегирует экземпляры классов-"предков".
2. Для каждого метода "предков" в "потомке" создается метод, который деоегирует вызов "предку". Иллюстрация

PHP:
class Foo { // extends Bar, Buzz
  var $bar;
  var $buzz;
  function Foo() {
    $this->bar = new Bar();
    $this->buzz = new Buzz();
  }
  function doBar() {
    $this->bar->doBar();
  }
  function doBuzz() {
    $this->buzz->doBuzz();
  }
}
 

Crazy

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

Demiurg

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

sokol

Zavolga.Net
Автор оригинала: Crazy
PHP:
class Foo { // extends Bar, Buzz
  var $bar;
  var $buzz;
  function Foo() {
    $this->bar = new Bar();
    $this->buzz = new Buzz();
  }
  function doBar() {
    $this->bar->doBar();
  }
  function doBuzz() {
    $this->buzz->doBuzz();
  }
}
Это Crazy привел классический пример делегирования. А кто нибудь совмещал агрегирование и делегирование? Я пробовал вроде бы нормально, но во это неудобство при работе с делегатами:-| всегда нужно явно указывать объект метод которого ты хочешь использовать....

Типа, модифицированный пример:

PHP:
class Foo extends Ext {
  var $bar;
  var $buzz;
  function Foo() {
    $this->Ext();
    $this->bar = new Bar();
    $this->buzz = new Buzz();
  }
  function doBar() {
    $this->bar->doBar();
  }
  function doBuzz() {
    $this->buzz->doBuzz();
  }
  function doExt() {
    $this->doExt();  
  }
}
 

Crazy

Developer
Автор оригинала: sokol
Это Crazy привел классический пример делегирования. А кто нибудь совмещал агрегирование и делегирование?
Это и есть агрегация и делегирование.
 

.des.

Поставил пиво кому надо ;-)
Screjet ты не слышал о рекурсии?
вообще конечно в примере скорее всего имелось ввиду что то вроде
PHP:
function doExt() { 
  parent::doExt();   
  }
или
PHP:
function doExt() { 
  Ext::doExt();   
  }
но может быть и так
PHP:
function doExt() { 
  static $c=2;
  return $c--?$this->doExt():0;
  }
 

Screjet

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

Screjet

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

Screjet

Новичок
Другое дело, еслиб метод с таким же названием, что и в родителе, выполнял другие операции, то это был бы уже полиморфизм.
 

sokol

Zavolga.Net
2Crazy - ну да агрегация и делегирование... я же для этих целей пример и привел.

Автор оригинала: .des.
Screjet ты не слышал о рекурсии?
вообще конечно в примере скорее всего имелось ввиду что то вроде
PHP:
function doExt() { 
  parent::doExt();   
  }
Ага! Именно! Просто торопился!
 

sokol

Zavolga.Net
2Crazy - ну да агрегация и делегирование... я же для этих целей пример и привел.

Автор оригинала: .des.
Screjet ты не слышал о рекурсии?
вообще конечно в примере скорее всего имелось ввиду что то вроде
PHP:
function doExt() { 
  parent::doExt();   
  }
Ага! Именно! Просто торопился!
 

Crazy

Developer
Автор оригинала: sokol
2Crazy - ну да агрегация и делегирование... я же для этих целей пример и привел.
Еще раз: мой пример иллюстрирует одновременное применение делегирования и агрегации.

Твой пример иллюстрирует еще и наследование.
 

Varg

Guest
2 Demiurg
2 Crazy

Благодарности. Буду разбираться :)
 

.des.

Поставил пиво кому надо ;-)
предполагается что был определен. чтобы не раздувать пример описание класса опустили.
 
Сверху