2012-05-03 45 views
2

我想有一個接口,它允許一個泛型類型實現與不同類型的接口

public function persist($object); 

但是我具體的實現有一個類型

public function persist(User $user); 

從我瞭解的PHP這不可能。從面向對象的設計角度來看,有人可以向我解釋爲什麼我所做的是錯誤的和錯誤的。

編輯:我應該澄清,我知道類型提示和它是如何工作的我的問題是真的試圖從OO的角度來理解,當我想要我的具體實現採取不同類型接口。

+0

好的。所以你想在界面方法中鍵入提示?如果不是,你能否用完整的例子來詳細解釋這個問題? –

+0

我的編輯幫助嗎? –

+0

從OOP的角度來看,我認爲你需要適配器類。 –

回答

3

接口的目的是成爲類之間的契約。如果多個具體類實現它,那麼接口就沒用了,但所有預期的輸入都是不同的。通過查看接口,您不知道實現類期望的輸入類型,從而使接口基本上無用。你不能交換所有使用相同接口的不同的具體類,因爲它們都期望有不同的輸入(具有不同的接口)。

我無法用classB替換classA,並保證它們都可以工作,因爲它們都具有相同的接口。這基本上使得接口對於人所知的每個OOP模式都是無用的。

編輯示例

class CommandList { 

    public function addCommand(Command $command) { 
     $this->commands[] = $command; 
    } 

    public function runCommands() { 
     foreach ($this->commands as $command) $command->run($this); 
    } 
} 

interface Command { 
    public function run(CommandList $commandList); 
} 

class Hop implements Command { 
    public function run(CommandList $commandList) { 
     // hop here 
    } 
} 

class Skip implements Command { 
    public function run(CommandList $commandList) { 
     // skip here 
    } 
} 

如何看接口作爲合同?如果你打破了這種聯繫,那麼執行命令的東西就不可以互換。

+0

謝謝,我想我需要爲傳入的對象創建一個接口(或抽象)。 –

+0

由於接口是契約,所有實現該契約的類在放入方法參數時應該是可互換的,該方法參數接受後續對象該界面。我將編輯以顯示一個示例。 – dqhendricks

+0

編輯完成... – dqhendricks