gpt4 book ai didi

java - 抽象类实现 Cloneable;抽象对象克隆()

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:01:38 29 4
gpt4 key购买 nike

假设我有这个类:

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 c = (Foobar) super.super.clone();

如果 Foobar 实现了 Cloneable 并且没有扩展 AbstractFoo,子类将工作。

除了使用扩展抽象类,我怎么能做“相同”的事情?

最佳答案

好的,你有更广泛的问题。我必须说你被搞砸了。这是相关问题: 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
}
}

比这里发布的任何内容都好得多。

先前的猜测:

也许您的想法不是 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();
}
}

}

嗯...如果您需要强制后代实现克隆...实际上我不喜欢这个想法,但在这种情况下为什么不做这样的事情呢?

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

}

关于java - 抽象类实现 Cloneable;抽象对象克隆(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28396285/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com