Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Extensions > Преимущества и недостатки, т.е. в каком случае исп


Автор: -=Ustas=- 2.6.2006, 23:31
Мое почтение!
Неоднократно встречал подобные конструкции:
Код

$this->variable->method();
// или 
$this->variable->var;

Сам такого не применял, стало интересно, что это и в чем его преимущества перед обычным наследованием. Копал литературу, и пришел к теме делигирования. 
Т.е., pls, поясните разницу между данными подходами, их преимущества / недостатки, рациональность / нерациональность их использования в каких-нить частных случаях:
Код

<?php

// Обычное наследование
class a
{
    var $var1;
    var $var2;

    function a()
    {
        $this->var1 = 'variable 1';
        $this->var2 = 'variable 2';
    }
}

class b extends a
{

}

$a = new a();
echo $a->var1.'<br>';
$b = new b();
echo $b->var1;

// ! -- Обычное наследование


// Вот этот самый подход

class a
{
    var $var1;
    var $var2;

    function a()
    {
        $this->var1 = 'variable 1';
        $this->var2 = 'variable 2';
    }
}

class  b
{
    var $s;

    function b()
    {
        $this->s =& new a();
    }
}

$a = new a();
echo $a->var1.'<br>';
$b = new b();
echo $b->s->var1;

// ! --

?>

Желательно, было бы кульно, если разъяснили бы все на примерах, в каких случаях стоит применять, а в каких нет....
Сеньки заранее!  

Автор: Mal Hack 2.6.2006, 23:45
Лично я преимуществ не вижу. Это все-таки разгные понятия. Наследование подрозумевает под собой переопределение, как бы абстрактных параметров, а тут - просто замещение, что не есть хорошо. ОДин большой объект с кучей всего. В случае модификаций, придется менять все.

Нет абстракции 

Автор: <Spawn> 5.6.2006, 08:10
Это не делегирование, а лишь обычная ссылка на экземпляр класса, хранящаяся в переменной-члене класса a.
Делегирование выглядело бы так(PHP5):

Код

class a
{
  private $variable;

  public function __construct($var)
  {
    $this->setVariable($var);
  }

  public function setVariable($var)
  {
    $this->variable = $var;
  }

  public function getVariable()
  {
    return $this->variable;
  }
}

class b
{
  private $a;

  public function __construct()
  {
    $this->a = new a();
  }

  public function setVariable($var)
  {
    $this->a->setVariable($var);
  }

  public function getVariable()
  {
    return $this->a->getVariable();
  }
}


Т.е. при создании экземпляра класса b ты внутри инстанцируешь скрытый экземпляр класса a, благодаря чему доступ к его методам скрыт. Так вот для того чтобы получить возможность доступа к этим методам (или к части методов) и используют подход, именуемый делегирование, т.е. это попросту обертка для вызова метода внутреннего объекта. Зачем это нужно? К примеру затем, чтобы:
1) Скрыть какие то методы существующего класса
2) Упростить инструкцию вызова нужного метода (к примеру, не совсем быстро набирать что то вроде $instance->objectA->objectB->objectC->objectD->objectE->someMethod()->helloWorld() smile , особенно без средств завершения кода)
3) Адаптация интерфейсов (можешь посмотреть ООД шаблон, именуемый адаптером - adapter (или оберткой - wrapper)). Т.е. у тебя имеются разнородные интерфейсы, допустим mysql и oracle API и нужно привести их к одному интерфейсу для создания уровня абстракции от СУБД. Для этого пишется нужный набор классов, которые делегируют вызовы этих API в нужном интерфейсе.  

Автор: -=Ustas=- 5.6.2006, 08:18
Пасибки за пояснительный пример!  smile  

Автор: szz 20.7.2006, 06:16
Цитата

$this->variable->method();
// или 
$this->variable->var;

   Это вроде композицией называется (по крайней мере в С++), впрочем есть и другие названия.
Цитата

тут - просто замещение, что не есть хорошо. 

   Не согласен. Все зависит от случая - бывает когда композиция необходима (например, если у вас есть класс "точка", а потом вы создаете класс "Треугольник". В треугольнике будут три точки, все логично. И еще много примеров пользы такого подхода) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)