0

継承されたクラスによって呼び出され、それらの値を使用する抽象クラスにメソッドを実装したかったのです。

例えば:

abstract class MyClass{
    String value = "myClass";
    void foo(){System.out.println(this.value);}
}

public class childClass{
    String value="childClass";
    void foo(){super.foo();}
}

public static void main(String[] args){
    new childClass.foo();
}

これは「myClass」を出力しますが、私が本当に欲しいのは「childClass」を出力することです。これは、他のクラスによって拡張されたときにそれらのクラスの値を使用する「一般的な」メソッドをクラスに実装できるようにするためです。

値を関数の引数として渡すことはできますが、説明した「アーキテクチャ」を実装できるかどうかを知りたいと思いました。

引数で値を渡さずに、呼び出し元自体ではなく呼び出し元からの値を使用する、継承されたクラスによって呼び出されるスーパーメソッド。

4

4 に答える 4

2

あなたはこのようなことをすることができます:

abstract class MyClass {

    protected String myValue() {
        return "MyClass";
    }

    final void foo() {
        System.out.println(myValue());
    }
}

public class ChildClass extends MyClass {
    @Override
    protected String myValue() {
        return "ChildClass";
    }
}

等々

于 2012-06-24T19:07:52.423 に答える
0

私はあなたがこれが可能かどうか尋ねていると信じています:

public class MyClass {
  void foo() {
    if (this instanceof childClass) // do stuff for childClass
    else if (this intanceof anotherChildClass) // do stuff for that one
  }
}

したがって、答えは「はい、実行可能です」ですが、a)ポリモーフィズムを使用する代わりに再実装しようとし、b)抽象クラスと具象クラスの分離に違反するため、非常に反対することをお勧めします。

于 2012-06-24T19:50:30.200 に答える
0

これは、構成が継承よりも優れている場所です

public class Doer{
   private Doee doee;

   public Doer(Doee doee){
       this.doee = doee;
   }
   public void foo(){
       System.out.println(doee.value);
   }
}

public abstract class Doee{
    public String value="myClass"
}

public ChildDoee extends Doee{
    public String= "childClass"
}

..。

//Excerpt from factory
new Doer(new ChildDoee);
于 2012-06-24T19:11:21.020 に答える
0

のインスタンスで異なるようにしvalueたいだけです。 これを行うには、childClassコンストラクターの値を変更します。MyClasschildClass

public class childClass {
    public childClass() {
        value = "childClass";
    }
}

編集:

コンストラクターをオーバーライド/置換できない場合は、インスタンスブロックを追加します(コンストラクターの後に実行され、宣言されていない「デフォルト」コンストラクターであっても)。

public class childClass {
    {
        value = "childClass";
    }
}
于 2012-06-24T19:14:40.493 に答える