Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преимущества и недостатки, т.е. в каком случае исп, насколько я понял, то это делигирование. 
:(
    Опции темы
-=Ustas=-
  Дата 2.6.2006, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: нет
Всего: 69



Мое почтение!
Неоднократно встречал подобные конструкции:
Код

$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;

// ! --

?>

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

Это сообщение отредактировал(а) -=Ustas=- - 2.6.2006, 23:32


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Mal Hack
Дата 2.6.2006, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



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

Нет абстракции 
PM ICQ   Вверх
<Spawn>
Дата 5.6.2006, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 1
Всего: 64



Это не делегирование, а лишь обычная ссылка на экземпляр класса, хранящаяся в переменной-члене класса 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 в нужном интерфейсе.  


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
-=Ustas=-
Дата 5.6.2006, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: нет
Всего: 69



Пасибки за пояснительный пример!  smile  


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
szz
Дата 20.7.2006, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 31.5.2005
Где: Moscow, Jerusalem

Репутация: 1
Всего: 33



Цитата

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

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

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

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


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Extensions | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.