2012-01-06 46 views
2

我有一個類ParentClass(),一些兒童類ChildClass1(),ChildClass2()等和一個接口iChild()。從ParentClass()ChildClass()繼承並實現iChild()接口:需要一個抽象常量?

class ChildClass1 
    extends ParentClass 
    implements iChild {} 

class ChildClass2 
    extends ParentClass 
    implements iChild {} 

iChild() -Interface,我想需要,一些常量需要填補(其中主要是標識和一些功能的定義)。我還沒有找到任何意義,因爲常量只能在界面中定義,但在實現類中不能重新定義。我找到的唯一解決方法是在iChild()中定義一些getter函數,然後返回必要的值,但這似乎不是正確的方法。由於我已經從ParentClass()延伸,我也不能使用抽象類來檢查所有ChildClass中所需常量的定義。

有關如何解決此問題的任何想法?


更新:要回答評論 - 用精簡和更具可讀性我的意思是以下幾點:

class ChildClass1 { 
    const MY_NAME = "Foo Bar Name 1"; 
} 

-- vs -- 

class ChildClass1 { 
    public function GetMyName() { 
     return "Foo Bar Name 1"; 
    } 
} 

我找到的第一個例子很多更具可讀性和比第二可以理解的。不幸的是,我目前沒有辦法執行由ChildClasses設置的MY_NAME。

回答

3

我不確定這裏的適當解決方案是否爲常數。常數的定義是它不會改變。如果iChild的每個實現都需要定義常量,那麼它不是一個常量,而是一個變量。我建議添加適當的getter方法,向用戶傳達他們需要在實現中提供這些信息。


好吧,我做了一個小測試,它根本是不可能的一類重寫而設定的常數通過它實現一個接口或者它延伸的父類。類常量似乎在編譯時檢查,如果試圖覆蓋它,則會引發致命錯誤。對於你想要做的事情,適當的答案是在你的界面中提供getter方法。

+0

這就是我目前實現它的方式,但我寧願調用常量而不是方法。它更精簡,「感覺更正確」。謝謝你的回答。 – Lars 2012-01-06 23:28:59

+1

它是如何精簡和「感覺更正確」?無論如何,不​​同的實現定義不同的常量而不將自己綁定到實現類的名稱。 – cspray 2012-01-06 23:32:36