2012-01-06 11 views
2

私はクラスParentClass()、いくつかの子クラスChildClass1()ChildClass2()など、およびiChild()というインターフェイスを持っています。 ChildClass()ParentClass()から継承やiChild()を実装しています:iChild() -interfaceでインタフェース:抽象定数が必要ですか?

class ChildClass1 
    extends ParentClass 
    implements iChild {} 

class ChildClass2 
    extends ParentClass 
    implements iChild {} 

、私はいくつかの定数は(主識別子と一部の機能の定義である)充填する必要があることを、必要としたいと思います。定数はインターフェイスでのみ定義できますが、実装クラスでは再定義できないため、意味はありません。私が見つけた唯一の回避策は、iChild()にいくつかのゲッター関数を定義することです。これは必要な値を返しますが、それは正しい方法ではないようです。私がすでにParentClass()から拡張しているように、私は抽象クラスを使用することもできません。すべてのChildClassesで必要な定数の定義を確認してください。

この問題に対処する方法はありますか?


更新:コメントに答えるために - スリムと私は次のように意味がより読みやすいと:

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

-- vs -- 

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

を私は2番目のより多くの読みやすく、理解しやすい最初の例を見つけます。残念ながら、私は現在、ChildClassesによってMY_NAMEが設定されるように強制する方法はありません。

答えて

3

ここでは、適切な解決策が定数であるかどうかはわかりません。定数の定義は変わらないということです。 iChildの各実装で定数を定義する必要がある場合は、実際には定数ではなく、変数です。適切なゲッターメソッドを追加して、実装にこの情報を提供する必要があることをユーザーに伝えることをお勧めします。


[OK]を、私は少しのテストを行なったし、それは単にそれが実装されたインタフェースまたはそれが拡張された親クラスによって一定の設定を無効にするクラスのことはできません。クラス定数はコンパイル時にチェックされ、オーバーライドしようとすると致命的なエラーがスローされます。あなたがしようとしていることは、あなたのインターフェースにゲッターメソッドを提供することです。

+0

これは私が現在実装している方法ですが、メソッドよりも定数を呼び出すことをお勧めします。それはより希薄で、より正確に感じます。あなたの答えはとにかくありがとう。 – Lars

+1

それはどのようにして「より正確に感じますか」ということですか?とにかく実装のクラス名に縛られることなく、異なる実装に異なる定数を定義させることはありません。 – cspray

関連する問題