2011-10-04 89 views
1

幾周前我開始練習面向對象的PHP,我做了一些類,但我不知道我是否正確理解這些概念。正因爲如此,我想展示一些課程,如果有人能告訴我他們對此的看法並能教我一些東西,我會很高興。PHP面向對象:抽象,接口,繼承等

,我會很感激,如果你能解釋一下你的評估和修改背後的原因,並記住......我在學習:$

我有一個目錄的產品,我們可以有多種類型的目錄。基本上是一個目錄是產品類的實例的集合...

我實現了一個基類目錄是這樣的:

class BaseCatalog 
{ 
    protected $_collection; 
    protected $_count; 

    public function __construct() 
    { 
     // some stuff here 
    } 

    public function getCount() 
    { 
     return $this->_count; 
    } 

    public function getProducts() 
    { 
     return $this->_collection; 
    } 
} 

後來當我會用我的目錄擴展此類

class OrganicCatalog extends BaseCatalog implements InterfaceCatalog 
{ 
    protected $_collection; 
    protected $_count; 

    public function __construct() 
    { 
     parent::__construct(); 
     // some more things here depending catalog type 
    } 

    // some more methods specific of this catalog type 

最後一個接口:

interface InterfaceCatalog 
{ 
    public function getCount(); 
    public function getProducts(); 
} 

有關的一些疑惑代碼

  • 所有目錄類型將具有相同的屬性,它們之間的差異是獲取此信息的過程。
  • 接口將有方法,所有目錄類型將實現,但只有方法的原型(如果我將定義一些行爲,我應該使用抽象類)它是正確的嗎?
  • 我認爲基礎產品將永遠不會直接實例化,我在抽象思維,但我一直在閱讀,摘要不能修改屬性...也許我可以把構造私有?
  • 哪種方法可以聲明屬性(collection,count ...)?只在基地?有人可以解釋嗎?
  • 將訪問器(getter和setter)放入基類中是正確的嗎?

我認爲這是所有... 謝謝大家提前,我知道這是一個有點無聊,解決像我的初學者疑惑。

很遺憾我的英語:$

+0

我不會以$ _開頭的成員變量,這是一個php4的回退。 –

回答

2

幾件事情:

  • BaseCatalog定義了所有由InterfaceCatalog使用的功能。我會考慮讓BaseCatalog執行InterfaceCatalog;它的每個子類定義也是InterfaceCatalog
  • OrganicCatalog應該可能沒有自己的$_count$_collection,因爲它們在基類中受到保護(因此可用於子類)。

只要屬性在抽象類中定義,抽象類就可以很好地修改屬性。理想情況下,抽象基類應該具有您希望子類繼承的功能(即「完成」減去您需要子類實現的功能)的近乎完整的實現。必須由子類實現的東西應該標記爲抽象。

如果您期望所有目錄延伸BaseCatalog,那麼根本沒有迫切需要的界面。它的主要用途是如果你期望有一個自己管理所有事物的目錄(即:它有自定義的getCountgetProducts方法)。這樣做的類應該實現接口,但不能擴展基類。如果InterfaceCatalog的實現不能總是像真實的目錄那樣工作,那麼可能應該添加接口。

+0

如果你想要強制每個子類都有一個特定的方法,那麼我不會使用一個接口,只需在父類的前面加上'abstract'即可。 –

+0

@cHao BaseCatalaog實現InterfaceCatalog和OrganicCatalog僅擴展BaseCatalog ...很有意義。很多謝謝!我問的其他問題是否正確? – SergiGP

+0

@DigitalPrecision如果我在baseproduct中設置抽象方法,那麼該類也將是抽象的......那麼如果類是抽象的,我可以在baseproduct的構造函數中使用來自數據庫的信息設置屬性? – SergiGP

0

目前看起來還不錯SergiGP。

所有目錄類型將具有相同的屬性, 他們之間的差異是獲得此信息的過程。

聽起來不錯。

接口將所有的目錄類型會實現,但方法 只有原型的方法(如果我將定義一些行爲,我 應該使用抽象類),它是正確的嗎?

是的,這是正確的。

我想想基地產品將永遠不會被直接實例化,我 是thinkink抽象,但我一直在讀那文摘不能 修改屬性...也許可以,我把構建私有?

這是不正確的。抽象類可以很好地修改屬性。所以你肯定可以定義爲BaseCatalog作爲抽象。而且,由於cHao already mentioned,我確實也建議你有BaseCatalog實施InterfaceCatalog

哪種方法可以聲明屬性(collection,count ...)? 只在基地?有人可以解釋嗎?

這是正確的把訪問者(getter和setter)在基類?

這實際上取決於您預見的基類衍生產品的要求。如果你認爲所有衍生產品都需要這些屬性,並且可以爲它們使用一些基本方法實現(getters),這就非常好了。我根本沒有看到任何問題。

如果你甚至不想衍生物覆蓋方法,你可以聲明它們爲final

+0

很感謝,非常完整的回答!我會再調查一下OO。再次感謝您的花費/浪費您的時間在我的懷疑:P – SergiGP