2013-02-26 125 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(); 
    } 
}