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

你没有super正确理解java中的关键字。参考javadoc 了解 super

如果您的方法覆盖了它的超类的方法之一,您可以通过使用关键字 super 来调用被覆盖的方法。您也可以使用 super 来引用隐藏字段(尽管不鼓励隐藏字段)

另外,super()用于调用父类的构造函数。

于 2013-02-26T17:11:53.493 回答
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 回答
0

看起来您想要实现委托模式

简单扩展 Super,让您的 IDE 通过创建 super 调用来覆盖所有方法。

然后替换“超级”。与“底层”。

容易出错,但仅此而已。

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 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 回答