我想做以下事情:
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();
}
}
这样的事情怎么办?
答案 0 :(得分:1)
您还没有正确理解java中的super
关键字。请参阅javadoc for super
如果您的方法覆盖了其超类的方法之一,则可以通过使用关键字super来调用重写方法。您也可以使用super来引用隐藏字段(尽管不鼓励隐藏字段)
此外,super()
用于调用父类构造函数。
答案 1 :(得分:0)
看起来您想要实现delegation pattern。
简单扩展Super,让IDE通过创建超级调用来覆盖所有方法。
然后替换“超级”。与“潜在的。”
容易出错,但就是这样。
public class Sub extends Super {
Super underlying;
public Sub(Super underlying) {
this.underlying = underlying;
}
@Override
public void f() {
underlying.f();
}
答案 2 :(得分:0)
public class Sub extends Super {
public Sub(Super underlying) {
this.underlying = (underlying == null)
? new Super()
: underlying;
}
@Override
public void method() {
underlying.method();
}
}
由于正在创建另一个对象,它并不完全相同,但它的行为与预期的一样。
答案 3 :(得分: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();
}
}