2015-01-09 64 views
1

我結束了幾次解決方案,其中有兩個類的層次結構。來自第一個(Greeters)hiearchy的類使用第二個(用戶)的類。覆蓋方法從派生子類獲取參數

繼承人例如:

class User {} 
class Admin extends User { 
    function getSecretMessage() { 
     return "secret"; 
    } 
} 

class Greeter { 
    public function hello(User $a) { 
     echo "hello!"; 
    } 
} 

class AdminGreeter extends Greeter { 
    public function hello(Admin $a) { 
     parent::hello($a); 
     echo "in addition heres a secret of mine: " . $a->getSecretMessage(); 
    } 
} 

在這裏,我有用戶和招待員的,在PHP中我收到錯誤(嚴格)

「AdminGreeter聲明::你好必須與迎賓::兼容你好「

我希望AdminGreeter::hello簡單地使用來自更專門化類(Admin)的數據」擴展「Greeter::hello

我還有什麼替代方案可以構建類似的PHP?

我想主要的問題是,PHP不支持「方法重載」,從而如果我發送一個User實例到AdminGreeter它會中斷。但是如果我有「方法重載」,Greeter::hello只會傳遞給用戶實例。

這可能是一個總體上不好的設計,因爲我最終遇到了這個問題,也許有人可以指出我對這個問題有更好的設計。

正如我旁註我似乎有同樣的問題,發展中的Objective-C

+1

'Admin'不是一個類,它是一個[接口](http://php.net/manual/en/language.oop5.interfaces.php) – 2015-01-09 21:28:37

+0

謝謝你的權利,我應該適當地使用措辭「類型「而不是」類「。我編輯的問題,以消除任何混淆:) – 2015-01-09 21:34:18

+0

可能重複的[PHP的接口繼承 - 聲明必須兼容](http://stackoverflow.com/questions/19131157/php-interface-inheritance-declaration-must-be-兼容) – 2015-01-09 21:34:54

回答

0

也許當你可以考慮使用Traits而不是爲這些「特殊班」

class User { 
    protected $name; 
    public function __construct($name) { 
     $this->name = $name; 
    } 
    public function __toString() { 
     return $this->name; 
    } 
} 

trait Admin { 
    function getSecretMessage() { 
     return "secret"; 
    } 
} 

class Greeter { 
    public function hello(User $a) { 
     echo "Hello ", $a, "!", PHP_EOL; 
    } 
} 

class AdminGreeter extends Greeter { 
    use Admin; 
    public function hello(User $a) { 
     parent::hello($a); 
     echo "in addition heres a secret of mine: " . $this->getSecretMessage(); 
    } 
} 

$x = new User('Natalie'); 
$y = new AdminGreeter; 
$y->hello($x); 
0

要繼續與原始代碼儘可能多:

interface iUser { 
    public function getSecretMessage(); 
} 

class Admin implements iUser { 
    function getSecretMessage() { 
     return 'secrete'; 
    } 
} 

class Greeter implements iUser{ 
    public function hello(iUser $a) { 
     echo 'hello'; 
    } 

    public function getSecretMessage(){} 
} 

class AdminGreeter extends Greeter { 
    public function hello(iUser $a) { 
     parent::hello($a); 
     echo ' in addition heres a secrete of mine: ' . $a->getSecretMessage(); 
    } 
} 

AdminGreeter::hello(new Admin); 

輸出hello in addition heres a secrete of mine: secrete