0

抽象基本クラスを作成しました。これには、サブクラスによって拡張される必要があるオブジェクトが含まれています。

public abstract class AbstractParent {
    protected AbstractObject subMePlz;
    // ... some fields that all subclasses need
    public AbstractParent() {
        this.subMePlz = createThisInYourExtendedClass();

    }

    public abstract AbstractObject createThisInYourExtendedClass();
} 

abstractObject:

public abstract class AbstractObject {
   // ... some fields/methods that all subclasses need 
}

私が欲しいのは、キャストせずに拡張クラスの拡張フィールドを使用できるようにすることです。

public class ExtendParent extends AbstractParent {
     // .. some unique fields
     public ExtendParent(){
       super();
     }


   public ConcreteObject createThisInYourExtendedClass(){
        return new ConcreteObject();
   }

   // what I want to do - no cast
   public void doSomethingWithSubMePlzWithoutCastingIt() {
        System.out.println(this.subMePlz);  
   }

   // what I end up doing - gotta cast
   public void doSomethingWithSubMePlzWithoutCastingIt() {
        System.out.println((ConcreteObject)this.subMePlz);  
   }
}

コンパレータが必要になると、これを実装する方法が変わりますか?-サブクラスで使用できるAbstractObjectsのリストの汎用コンパレーターを考えています。

4

4 に答える 4

4

一般的なものにする必要があるようです。

public abstract class AbstractParent<T extends AbstractObject> {
    protected T subMePlz;
    // ... some fields that all subclasses need
    public AbstractParent() {
        this.subMePlz = createThisInYourExtendedClass();

    }

    public abstract T createThisInYourExtendedClass();
} 

public class ExtendParent extends AbstractParent<ConcreteObject> {
    ...
}

コンストラクター内で非プライベートメソッドを呼び出すことは通常悪い考えであることに注意してください。サブクラスはまだ完全に初期化されていないため、実際にどれだけ信頼できるかを推論するのが難しくなる可能性があります。

于 2012-04-24T16:51:54.193 に答える
3

2つのオプションがあります。

  1. プロジェクトを放棄して、スーパークラスのフィールドを宣言します。代わりに、内部抽象「getter」メソッドをスーパークラスに追加します。基本的に、AbstractParentメソッドが必要abstract AbstractObject getSubMePlz()です。
  2. ジェネリックスを使用して、サブクラスのタイプを設定しsubMePlzます。フィールドにを設定するように定義AbstractParent<T>します。TsubMePlz

個人的には、オプション1は非常に快適に拡張できることがよくあります。たとえば、getSubMePlz()リターンタイプをまだ宣言せずに絞り込む別のサブクラスを作成すると、有利になる可能性があります。

于 2012-04-24T16:50:56.690 に答える
0

これを使ってみませんか-

     super.subMePlz

これの代わりに -

    (ConcreteObject)this.subMePlz

そうすれば、キャストは必要ありません。

于 2012-04-24T16:53:52.720 に答える
0

オブジェクトのコピーをサブクラスに保存することもできますが、正しいクラスを使用します。

public class ExtendParent extends AbstractParent {
  ConcreteObject concreteObject;

  public AbstractObject createThisInYourExtendedClass(){
    ConcreteObject concreteObject = new ConcreteObject();
    return concreteObject;
  }
  public void doSomethingWithSubMePlzWithoutCastingIt() {
    System.out.println(concreteObject);  
  }

  ...
于 2012-04-24T16:57:16.087 に答える