2013-02-26 139 views
1

我想做到以下几点:如何将super分配给变量?

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(); 
    } 
} 

怎么能像这样做呢?

+3

你正在尝试使用此代码来解决? – 2013-02-26 17:03:52

+0

为什么不简单地在重写的方法内使用'super.method()',那么'underlying.method()'的需求是什么?为什么你在做什么,你在做什么,将高度赞赏:-) – 2013-02-26 17:06:40

+1

为什么你不直接调用'super'? – moeTi 2013-02-26 17:06:47

回答

0

它看起来像你想实施delegation pattern

简单扩展超级,并让您的IDE覆盖所有创建超级调用的方法。

然后替换“超级”。与“基础”。

容易出错,但就是这样。

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

    @Override 
    public void f() { 
     underlying.f(); 
    } 
+1

这不会做我想要的。例如,基础== null时的行为不同。 – 2013-02-26 17:15:44

1

您还没有正确理解Java中的super关键字。请参考javadoc for super

如果你的方法会覆盖其父类的方法之一,您可以通过使用关键字super的调用重写的方法。您还可以使用超级指一个隐藏字段(虽然隐藏字段气馁)

此外,super()用来调用父类的构造函数。

0
public class Sub extends Super { 
    public Sub(Super underlying) { 
    this.underlying = (underlying == null) 
     ? new Super() 
     : underlying; 
    } 

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

由于正在创建另一个对象,它不完全相同,但它的行为与预期相同。

+0

我不认为这是干净的做法。如果您的原始对象具有某个状态,则此解决方案会导致问题,因为新创建的超级对象可能不具有相同的状态。因此,按照@Patricia的建议检查'null'会更好。 – 2015-09-09 15:36:51

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(); 
    } 
}