Разрешение объекту определять его класс - PullRequest
0 голосов
/ 01 декабря 2010

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

В javascript (хорошо, у js нет классов, но это проясняет суть), вы можете простоdo

function A() {
    if(some_condition) {
        return new B();
    }
    //else we proceed to customize and return our object
}

Я хочу сделать что-то подобное в PHP.Лучшее, что я могу придумать, это

class A {
    private function __construct() {
        //whatever you need to do
    }

    public static function getInstance() {
        if(some_condition) {
            return new B();
        }
        else {
            return new A();
        }
    }
}

Проблема в том, что клиентский код всегда должен знать, что A особенный, и вам нужно создавать экземпляры объектов статическим методом.

Есть ли способ делегировать A выбор типа объекта для бесперебойного возврата?

1 Ответ

0 голосов
/ 17 ноября 2011

К сожалению, нет, лучшее, что я думаю, вы можете сделать, это что-то вроде:

class Decider {

    public static function decide() {
        if(some_condition) {
            return "A";
        }
        else {
            return "B";
        }
    }
}

$new_class = Decider::decide();

$new_object = $new_class();

Но опять же, это действительно ничем не отличается от того, как вы подошли к нему. Я бы не считал это неправильной схемой проектирования, однако я бы оставил решение сделать это внешнему классу, а не тому, чтобы класс «А» или класс «В» выполняли решение внутри них. В идеале ваши классы должны быть инкапсулированы таким образом, чтобы им не требовались другие классы, если они не являются переменными-членами самого класса или не переданы в класс для функциональных целей.

...