2016-08-07 92 views
-1

我有以下代码。调用实现接口的所有类

接口车辆有一个方法calculateDistance。

级轿车实现了车辆 类自行车实现车辆 类电单车实现车辆

我想接下来做的就是在我的控制器的方法调用每一个实现车辆和calculateDistance获取值类。

什么是最好的方式/设计模式来实现这一目标?

此时我只是调用实现接口Vehicle(通过ReflectionClass)的所有类并遍历它们以调用此方法。

+0

事情是,与designpatters你可以'尝试'多种事情。这不是关于尝试,而是关于什么才是实现这一目标的最正确方法。 我可以粘贴所有可能的东西,我'尝试',但这只是混乱的问题。 – SnIpY

+2

你说“我有以下代码”,但是实际上并没有显示代码......你只是有点描述它。发布代码(最新的迭代)。还要描述你解雇的变化,以及你为什么解雇他们。这是一个现实世界的问题还是作业?这是一个非常奇怪的现实世界需求:“[...]我的控制器中的一个方法,调用每个实现Vehicle的类并从calculateDistance获取值”。你为什么需要这样做?即:你作为最终结果需要达到什么目标? –

回答

0

最好的方法是实现CompilerPass。这是一个example。 因此,创建一个注册表类(在该示例中为TransportChain类),接口以及实现该接口的所有类,将它们定义为服务并为其指定标签名称。 之后,您可以在您的操作中调用该注册表服务,并通过每个服务调用您想要的方法。

基本例如:

接口

interface SomeInterface { 
    public function doSomething(); 
} 

服务1:

class First implement SomeInterface { 
    public function doSomething() { 
     // do smth 
    } 
} 

服务2:

class Second implement SomeInterface { 
    public function doSomething() { 
     // do smth 
    } 
} 

Registry类:

class MyRegistry 
{ 
    private $services = []; 

    public function addMyService($service) 
    { 
     $this->services[] = $service; 
    } 

    public function all() 
    { 
     return $this->services; 
    } 
} 

CompilerPass:

... 

    $myServices = $container->findTaggedServiceIds('my_tag'); 

    if (empty($myServices)) { 
     return; 
    } 

    $registry = $container->getDefinition('my_registry'); 

    foreach ($myServices as $key => $myService) { 
     $registry->addMethodCall('add', [new Reference($key)]); 
    } 

    ... 

clearign缓存后,你可以打电话给他们在你的行动:

... 

foreach ($this->get('my_registry')->all() as $myService) { 
    $myService->doSomething(); 
} 

... 

整个其他的东西,比如宣称的服务,给他们的标签名,注册你的编译器pass已经写成here

相关问题