2

私は次のことをしたいと思います:

public class Sub extends Super {
  public Sub(Super underlying) {
    if (underlying == null) {
      underlying = super; // this line is illegal
    }

    this.underlying = underlying;
  }

  @Override
  public void method() {
    underlying.method();
  }
}

このようなことはどのように行うことができますか?

4

4 に答える 4

1

superJava のキーワードを正しく理解していません。スーパーの javadoc を参照してください

メソッドがそのスーパークラスのメソッドの 1 つをオーバーライドする場合、キーワード super を使用してオーバーライドされたメソッドを呼び出すことができます。super を使用して非表示フィールドを参照することもできます (ただし、フィールドを非表示にすることは推奨されません)。

また、super()親クラスのコンストラクターを呼び出すためにも使用されます。

于 2013-02-26T17:11:53.493 に答える
0
public class Sub extends Super {
  public Sub(Super underlying) {
    this.underlying = (underlying == null)
        ? new Super()
        : underlying;
  }

  @Override
  public void method() {
    underlying.method();
  }
}

別のオブジェクトが作成されているため、まったく同じではありませんが、期待どおりに動作します。

于 2013-02-26T17:14:23.897 に答える
0

委任パターンを実装したいようです。

シンプルに Super を拡張し、IDE がすべてのメソッドをスーパー コールの作成でオーバーライドできるようにします。

次に、「スーパー」を置き換えます。「根底」で。

エラーが発生しやすいですが、それだけです。

public class Sub extends Super {
    Super underlying;
    public Sub(Super underlying) {
        this.underlying = underlying;
    }

    @Override
    public void f() {
        underlying.f();
    }
于 2013-02-26T17:10:30.293 に答える
0

関連するメソッドのサブクラス固有のメソッド名を追加して呼び出したい場合は、次のようなことができると思います。

public class Test {
  public static void main(String[] args) {
    Super sup = new Super();
    Sub sub1 = new Sub(null);
    Sub sub2 = new Sub(sup);
    sub1.subMethod();
    sub2.subMethod();
    sup.method();
  }
}

class Super {
  public void method(){
    System.out.println("Using method from "+this);
  }
}

class Sub extends Super {
  private Super underlying;
  public Sub(Super underlying) {
    if (underlying == null) {
      underlying = this;
    }

    this.underlying = underlying;
  }

  public void subMethod() {
    underlying.method();
  }
}
于 2013-02-26T18:19:34.507 に答える