2015-01-08 2 views
-2

У меня проблема.Как работать с разными классами из 1 интерфейса (класса)

Например: у меня есть класс «Поставщик» и подклассы «Provider_1», «Provider_2».

«Провайдер» - менеджер для «Provider_1» и «Provider_2».

, как он работает сейчас:

  1. я есть метод getFullInfo() в "Поставщик", "Provider_1" и классов "Provider_2".
  2. Я хочу получить информацию от Provider_1 :: getFullInfo(), но мой контроллер должен работать через класс «Provider».

Я запрашиваю: Provider :: getFullInfo ($ provider_id) и в Provider :: getFullInfo использует конструкцию switch..case для маршрутизации.

Мой вопрос: как сделать запрос с помощью «Провайдера» без коммутатора.

Благодаря

+0

Показать фактический код, вы используете статические методы, как указывает ваш '::'? –

+0

Выполняют ли классы 'provider_1' и' provider_2' наследовать 'провайдера'? Если это так, вы можете просто вызвать 'getFullInfo', не зная, есть ли у него' prodiver', 'provider_1' или' provider_X' – DarkBee

+0

@DarkBee, к примеру, вы можете взять ссылку? – Roman

ответ

0

Пример для обобщения моего комментария. Как вы можете видеть, если и расширить все из того же интерфейса/класса можно просто вызвать метод без проверки фактического типа до тех пор, как вы знаете его из super типа Foo, в этом случае

<?php 

class Foo { 
    protected $name; 

    public function __construct($n) { 
     $this->name = $n; 
    } 

    public function getName() { 
     return $this->name; 
    } 
} 

class Bar extends Foo { 

} 

class FooBar extends Foo { 
    public function getName() { 
     return strtoupper($this->name); 
    } 
} 

function sayName(Foo $f) { 
    return 'Hello '. $f->getName(); 
} 

$instances = array(
    new Foo('Foo'), 
    new Bar('Bar'), 
    new FooBar('FooBar'), 
); 

foreach($instances as $instance) { 
    echo sayName($instance).'<br />'.PHP_EOL; 
} 
0
  1. переопределение родительского метод getFullInfo() в дочерних классах.
  2. если вы хотите, чтобы пользователь родительского метода вы должны использовать родительский класс (провайдер), или, используя дочерний класс (provider_1), вызов из своего метода родительского метода

    функции getFullInfo() { родитель :: getFullInfo(); ...}

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

Я не уверен, правильно ли я понял, что вы пытаетесь выполнить.

Смежные вопросы