Как я могу динамически изменить класс объекта из родительского метода? - PullRequest
4 голосов
/ 20 апреля 2010

У меня есть класс под названием Report. У меня есть несколько классов, которые наследуются от отчета, ClientReport, ClientVisitReport ...

class Report {
    ...
    public function load($id) {
        ...
    }
}

class ClientReport extends Report {
    ...
    public function load($id) {
       parent::load($id);
       ...
    }
}

class ClientVisitReport extends Report {
    ...
    public function load($id) {
        parent::load($id);
        ...
    }
}

Я хочу иметь возможность вызывать правильный конструктор из идентификатора, который я даю методу load. Каждый идентификатор имеет свой собственный класс отчета.

В основном я спрашиваю, как я мог сделать это:

$reportObject = new Report(); // reportObject is a Report
$reportObject->load(15678); // report 15678 is a ClientReport, $reportObject is now a ClientReport

Как мне это сделать? Я могу ошибаться в своем дизайне, есть ли лучший способ сделать то, что я хочу?

Ответы [ 3 ]

4 голосов
/ 20 апреля 2010

Возможно, вы захотите взглянуть на шаблон AbstractFactory . Одна из его целей -

Предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания их конкретных классов.

Внизу связанной страницы есть примеры PHP.

0 голосов
/ 20 апреля 2010

Один из способов, который может помочь, - это иметь класс ReportLoader, в котором вы сохраняете поведение Load и выбираете тип объекта отчета, который вы собираетесь создать. Таким образом, отчет будет нести ответственность за отчетность, а загрузчик будет загружать правильные данные в правильную ответственность объекта.

0 голосов
/ 20 апреля 2010

Изменение класса для класса объекта не очень хорошая идея (если вообще возможно. Это не в большинстве языков).

Я бы использовал для этого шаблон проектирования Прототип вместе с хэш-картой для хранения номеров / типов отчетов.

Таким образом, код в конце будет:

$reportObject = $reportTypes[15678]->clone();

См. this для более подробной информации и примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...