2016-08-07 151 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

相關問題