Классы: наследование или агрегация

klep

Новичок
Классы: наследование или агрегация

Есть порядка 15 классов.
Для удобства работы я их объеденил в три класса (с помошью наследования). Два класса по функциональным зависимостям между предками дополняют себя, а вот третий класс нет.
Он наследует порядка 8 классов, которые сильно не связанны друг с другом.
Разбить на более мелкие иерархии не получается (каждый из 8 классов реализовывает свое).

Хочется добиться некоторого подобия инкапсуляции, пользователь работает только с 3мя классами, а те в свою очередь передают управление своим предкам.

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

Что посоветуете?
Оставить все как есть или пересмотреть структуру?
 

filter

Новичок
Если все так запутано, то может лучше пересмотреть структуру?


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

klep

Новичок
про паттерны я читал !
Но имхо применить их в php не получается !

А если такое возможно то скажите какой именно патерн (Абстрактная Фабрика)?

И все-таки по поводу наследование классов , которые сильно не связаны друг с другом ?
 

tony2001

TeaM PHPClub
>Но имхо применить их в php не получается !
все - возможно, нет.
основные - очень даже.

>А если такое возможно то скажите какой именно патерн (Абстрактная Фабрика)?
почему бы и нет?

>И все-таки по поводу наследование классов , которые сильно не связаны друг с другом ?
что-то типа "Class Пачка_Сигарет extends Клавиатура" ?
сам-то понимаешь бессмысленность такого наследования ?
 

klep

Новичок
Типа такого

SiteManager: extends Mytable , MyMenu, MyXml, HtmlManage, Calc, Graphics

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

-~{}~ 01.03.04 11:45:

Тем более в патернаx используются виртуальный функции и интерфейсы чего в 4 php я не нашел !
 

tony2001

TeaM PHPClub
>SiteManager: extends Mytable , MyMenu, MyXml, HtmlManage, Calc, Graphics
???
где ты тут углядел возможность наследования?
 

klep

Новичок
Наследование ради удобства, а не ради наследования.
 

tony2001

TeaM PHPClub
klep
если тебе удобно сидеть на стуле вверх ножками - сиди ради бога.
только зачем это в форуме обсуждать?
а если уж обсуждаешь, то объясни как класс Человек может наследоваться от класса Рука?
 

kvn

programmer
Он наследует порядка 8 классов, которые сильно не связанны друг с другом.
Разбить на более мелкие иерархии не получается (каждый из 8 классов реализовывает свое).
Abstract Factory или factory method - но опять же, если они связаны хоть какой-то логикой..

Если делать через агрегацию, то потребуется дублировать методы, а этого делать не хочется.
можно попробовать извратиться в данном случае через:
get_class_methods(), if_method_exists()... и т.д.
 

klep

Новичок
Originally posted by tony2001
klep
если тебе удобно сидеть на стуле вверх ножками - сиди ради бога.
только зачем это в форуме обсуждать?
а если уж обсуждаешь, то объясни как класс Человек может наследоваться от класса Рука?
А кто сказал, что удобно ?
Не удобно по этому и спрашиваю !

Хорошо пускай будет абстрактная фабрика, но как вызвать
метод из другого класса не используя обертки.

class TAdmin
{
function TAdmin(&$obj)
{
$this->_MyAccount=$this->_callClass("TMyAccount");
}


function StartSession()
{
$this->_MyAccount->InitSession();
}

}
 

Ямерт

The Old One
>Но имхо применить их в php не получается !
Уже полгода применяю MVC, получается вполне :)
 

kvn

programmer
class TAdmin
{
function TAdmin(&$obj)
{
$this->_MyAccount=$this->_callClass("TMyAccount");
}


function StartSession()
{
$this->_MyAccount->InitSession();
}

}
это, ИМХО, агрегация, а не фабрика.

пример фабрики:
взять с PEAR::DB...

PHP:
class DB {
    function &factory($type)
    {
        @include_once("DB/${type}.php");

        $classname = "DB_${type}";

        if (!class_exists($classname)) {
            return PEAR::raiseError(null, DB_ERROR_NOT_FOUND,
                                    null, null, null, 'DB_Error', true);
        }

        @$obj =& new $classname;

        return $obj;
    }

}
 

klep

Новичок
Да, да это агрегация.

Вопрос именно с ней и связан, как обратиться к объекты не через ф-ию обертку ?
 

kvn

programmer
PHP:
class One {
   function Foo() {
    echo "One::Foo()\n";
   }
}

class Two {
  function Bar() {
   echo "Two::Bar()\n";
  }
}

class Aggregat {
   function Aggregat() {
    $this->c[0] = &new One();
    $this->c[1] = &new Two();
  }

  function call($method_name) {
    $method_name = strtolower($method_name);

   foreach ($this->c as $my_object) {
     $class_methods = get_class_methods(get_class($my_object));
     if (in_array($method_name, $class_methods)) {
       return $my_object->$method_name();
     } else {
        continue;
     }
  }
  }
}

$a = &new Aggregat();

$a->call("Foo");
$a->call("Bar");
php aggregat.php
Content-type: text/html
X-Powered-By: PHP/4.3.0

One::Foo()
Two::Bar()


идея понятна...
 

klep

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

Все понятно !
Всем спасибо за проявленный интерес.

А если говорить о схеме, то я буду использовать следующую:

 
Сверху