2016-06-28 10 views
0

私はabstract class Aを持っており、そのサブクラスはString TitleString Descriptionのプロパティを持つように強制します。したがって、B extends Aの場合、BはBのすべてのインスタンスで同じ値を持つプロパティTitleを持つことが保証されます。サブクラス固有の情報を格納する方法は?

Javaが静的抽象メソッド(すべてのサブクラスになければならない静的メソッド)を許可する場合、ただ

public abstract class A { 
    public static abstract String getTitle(); 
    public static abstract String getDescription(); 
} 

私がこれまでに作ってみた最高のアイデアを書きdは、各サブクラスのための個別のタイトルを格納列挙と説明を使用することです。そうすれば、私はすべてのTitleを単一のループで見ることができ、必要なタイトルのサブクラスをインスタンス化できます(これが望ましい動作です)。残念ながら、サブクラスを追加するたびに列挙型を変更する必要があります。より良い方法がありますか?

答えて

2

が静的​​なものと継承を混合忘れるA.を拡張する2つのフィールドは、任意のクラスに表示され、この方法。ちょうどトラブルが必要です。

代わりに、あなたは、これはクラスAにOOの本質を保護されたフィールドを置くよりも「より良い」で、継承はそう(約行動であることに注意してくださいOCP

abstract class A { 
    public final String getTitle() { return getTitleInternal(); } 
    abstract String getTitleInternal(); 

class B extends A { 
    @Override 
    String getTitleInternal { maybe return some static value of B } 

に向ける、あなたは正しかったですあなたのサブクラスで特定のメソッドが必要だと言っている)。

EDIT:あなたのコメントをもう一度読んだ後。私は私がやった

+0

ありがとうございます。しかし、タイトルを知る前にクラスをインスタンス化したくないのであればどうしますか?私のデザインを再考すべきでしょうか? 私が抱えている問題は、ユーザーにサブクラスを選択させることです。今私はそれが良い決断ではないと思う。 –

1

あなたは保護されたフィールドを使用すると思いますか?

public abstract class A { 
    protected String title; 
    protected String description; 
} 

public abstract class B extends A { 
     public B(){ 
      title = ... 
      description = .... 
     } 

    } 
+0

相続上構図に焦点を当てたインターフェース

B)を使用して

A)であなたを思い出させるように誘惑していますし、2つの理由は、彼らが適切ではないがあります:(1)タイトルと説明がなければなりません(2)同じサブクラスの複数のインスタンス間でタイトルと説明の価値が異なることがないようにすることは良いことです。 –

+0

タイトルと説明に抽象クラスのgetter/setterメソッドを持たせることができるため、アクセス可能です。複数のインスタンスについては、シングルトンも使用します。しかし、このケースでは、@Jägermeisterの答えが良いと思います。 –

関連する問題