我正在構建一些類(在PHP中,儘管此問題也擴展到其他OOP語言),它們保存來自數據庫的信息。因此,我想創建一個接口:「可同步」。接口類中的具體方法
interface syncable{
protected function _pushToDB();
protected function _pullFromDB();
}
我遇到的問題是,我想「可同步」也有這(可能)不會改變去用的方法和變量:
protected $sync = 0;
public function sync(){
if($this->sync == 0){
// DB in sync with class; Do nothing.
}
if(this->sync == 1){
$this->_pushToDB();
$this->sync = 0;
}
if(this->sync == -1){
$this->_pullFromDB();
$this->sync = 0;
}
}
作爲變量的實施改變類,或者數據庫在別處更新,$ sync變量會更新以正確反映所需的同步類型,然後可以在某個點調用sync(),然後調用正確實現的方法。雖然_pushToDB()和_pullFromDB()對於每個類都非常專業化,但sync()在大多數(即使不是全部)類之間仍將保持不變。由於實現諸如「users」,「foo」和「bar」的「syncable」類與「syncable」沒有真正的關係,並且可能需要擴展其他類,因此「syncable」應該是一個接口而不是「可同步」一個抽象類。
所以我的問題是,完成這個最好的方法是什麼?我必須將我的sync()函數複製粘貼到實現「可同步」的每個類中嗎?我是否創建了一個抽象類,並希望沒有擴展「可同步」的類需要擴展任何其他類? (由於PHP和許多OOP不支持多繼承)是否還有其他更適合這種情況的PHP解決方案?有沒有針對這個問題的通用OOP解決方案?
真的沒有PHP的其他答案。在PHP中缺乏多重繼承的特性本質上是一種解決方法。 –
是的,它是一種變通方法,但我現在已經使用它們很多次了,從來沒有遇到任何麻煩,並且有機會集中很多代碼,而不需要從怪物抽象類繼承:D – taxicala
沒有說這是一個不好的方法來使用。事實上,這是許多人都不知道的PHP中相當有用的功能。我應該也許會說這是PHP的(和其他具有特質結構的語言)回答多重繼承。 –