2015-02-08 111 views
3

可以說我有這個類:抽象類實現Cloneable;抽象對象的clone()

public abstract class AbstractFoo implements Cloneable { 

    public abstract Object clone(); 

} 

類和子類:

public class Foobar extends AbstractFoo { 

    @Override 
    public Object clone() { 
     try { 
      Foobar c = (Foobar) super.clone(); 
      /* some operations */ 
      return c; 
     } catch (CloneNotSupportedException e) { 
      throw new InternalError(); 
     } 
    } 

} 

我知道這是不可能的,但我想你明白我想要什麼。如果Foobar實現了Cloneable並且沒有擴展AbstractFoo,子類將會工作。我想我會想要什麼,但不允許是:如果Foobar的實現了Cloneable並沒有延伸AbstractFoo

Foobar c = (Foobar) super.super.clone(); 

子類是可行的。

我該怎麼做「相同」,但擴展抽象類?

+0

我不明白。你期望'super.clone();'做什麼?你想要它做什麼? – 2015-02-08 16:23:59

+0

你能解釋一下你想做什麼以及哪些不起作用嗎?更具描述性的標題也是有用的。 – 2015-02-08 16:24:25

+0

如果Foobar實現了Cloneable並且沒有擴展AbstractFoo,這段代碼就可以工作。 我該怎麼做「相同」,但擴展抽象類? – 2015-02-08 16:27:59

回答

0

這項工作?

public abstract class AbstractFoo implements Cloneable { 

    public abstract Object clone(); 

    // Enables subclasses to call "super.super.clone()" 
    public Object superDotClone() throws CloneNotSupportedException { 
     return super.clone(); 
    } 

} 

隨着子類:

public class Foobar extends AbstractFoo { 

    @Override 
    public Object clone() { 
     try { 
      Foobar c = (Foobar) super.superDotClone(); 
      /* some operations */ 
      return c; 
     } catch (CloneNotSupportedException e) { 
      throw new InternalError(); 
     } 
    } 

} 
+0

哎呀..看起來很相似,但我正在考慮哪種解決方案(這個或我的)更髒。其實這個問題是關於強迫後代覆蓋已經實施的東西。 – 2015-02-08 17:00:13

+0

我更喜歡我的,因爲我希望AbstractFoo實現一個請求clone()方法的接口。 – 2015-02-08 17:04:14

0

好的,你有更多更廣泛的問題。我必須說你搞砸了。這裏是相關的問題: Force every class of an inheritance chain to override an abstract method

任何抽象類實現Cloneable實際上依賴於Object.clone()的主要問題。因此,它是在一般的問題,而解決辦法,但...

提出的解決方案:

我有一個想法從這裏:Mandatory cloneable interface in Java

public interface Modifiable<T extends Modifiable<T>> extends Cloneable { 
    T clone(); 
} 

public class Foo implements Modifiable<Foo> { 
    public Foo clone() { //this is required 
     return null; //todo: real work 
    } 
} 

比什麼都貼在這裏要好得多。

上一頁GUESSINS:

也許你的想法是不是100%清楚,但適用這種方法?

public abstract class AbstractFoo implements Cloneable { 

    public Object clone() throws CloneNotSupportedException { 
     return super.clone(); 
    } 

} 

然後......

public class Foobar extends AbstractFoo { 

    @Override 
    public Object clone() { 
     try { 
      Foobar c = (Foobar) super.clone(); 
      /* some operations */ 
      return c; 
     } catch (CloneNotSupportedException e) { 
      throw new InternalError(); 
     } 
    } 

} 

嗯......如果你需要強制後代impleement克隆...其實我不喜歡這個主意的氣味,但爲什麼不做某事像這樣在這種情況下?

public abstract class AbstractFoo implements Cloneable { 

    public Object clone() throws CloneNotSupportedException { 
     return cloneMe(); 
    } 

    abstract protected Object cloneMe(); 

} 

最後...不好,但你問這個;-)。

public class Foobar extends AbstractFoo { 

    @Override 
    public Object cloneMe() { 
     try { 
      Foobar c = (Foobar) super.clone(); 
      /* some operations */ 
      return c; 
     } catch (CloneNotSupportedException e) { 
      throw new InternalError(); 
     } 
    } 

} 
+0

是的,這將工作。這裏的問題是我想要一個實現具有_public抽象對象clone()_的Cloneable的抽象類。所以抽象類將強制子類實現clone()方法。我猜這是不可能的? – 2015-02-08 16:42:58

+0

由於類是抽象的,沒有人會注意到不同(如果方法是抽象的)。咦? – 2015-02-08 16:44:41

+0

不同之處在於子類不會被迫實現clone()方法。 – 2015-02-08 16:50:17