抽象 class 实现 Cloneable;抽象对象克隆()
abstract class implements Cloneable; abstract Object clone()
假设我有这个 class:
public abstract class AbstractFoo implements Cloneable {
public abstract Object clone();
}
和子class:
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,则 subclass 将起作用。我想我想要但不允许的是:
Foobar c = (Foobar) super.super.clone();
如果 Foobar 实现了 Cloneable 并且没有扩展 AbstractFoo,则 subclass 将起作用。
如果使用扩展摘要 class,我怎么能做到 "the same"?
好的,你有更广泛的问题。我必须说你被搞砸了。这是相关问题:
Force every class of an inheritance chain to override an abstract method
任何实现 Cloneable
的抽象 class 的主要问题实际上依赖于 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();
}
}
}
这行得通吗?
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();
}
}
}
假设我有这个 class:
public abstract class AbstractFoo implements Cloneable {
public abstract Object clone();
}
和子class:
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,则 subclass 将起作用。我想我想要但不允许的是:
Foobar c = (Foobar) super.super.clone();
如果 Foobar 实现了 Cloneable 并且没有扩展 AbstractFoo,则 subclass 将起作用。
如果使用扩展摘要 class,我怎么能做到 "the same"?
好的,你有更广泛的问题。我必须说你被搞砸了。这是相关问题: Force every class of an inheritance chain to override an abstract method
任何实现 Cloneable
的抽象 class 的主要问题实际上依赖于 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();
}
}
}
这行得通吗?
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();
}
}
}