gpt4 book ai didi

java - 实现在返回具体类的接口(interface)中定义的克隆吗?

转载 作者:行者123 更新时间:2023-11-30 02:33:28 25 4
gpt4 key购买 nike

我正在阅读 DesignPatterns(“GoF 模式”)并实现示例 MazeGame。在阅读有关原型(prototype)的内容时,我遇到了编写克隆方法 (cloneIt()) 的问题。

首先是我的结构:

界面:MapSite

AbstractClass:AbstractMapSite

具体实现:房间

我的计划是在MapSite中定义cloneIt并给出默认实现(只需调用Object.clone()),这可以是在具体类中被覆盖。现在,cloneIt() 方法始终返回接口(interface)类型 MapSite

即使使用了抽象类中的方法,是否有办法“强制”Java 返回具体类类型(Room、Door、Wall)?可以避免强制转换。

我了解接口(interface)的优点以及使用它们的原因:)

解决方案

正如 @philipp-wendler 和 @davidxxx 所建议的,我最终使用了泛型。如果 Object.clone() 的浅拷贝出现问题,我会在具体类中重写 cloneIt()

public interface MapSite<T> extends Serializable {
T cloneIt();
}
...

public abstract class AbstractMapSite<T> implements MapSite<T> {
public T cloneIt() {
try {
return (T) clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
...

public class Wall extends AbstractMapSite<Wall> {
public Wall cloneIt(){
// special code here
}
}

最佳答案

My plan is to define cloneIt in MapSite and give a default implementation (simply calling Object.clone()), which can be overidden in the concrete classes.

请注意:Object.clone() 的默认实现会生成克隆对象的浅拷贝,如果不这样做,您还应该实现 Cloneable 接口(interface)希望看到抛出 CloneNotSupportedException

因此,您应该重写 clone()cloneIt()。这很令人困惑,因为单一方法就足够了。只需保留 cloneIt() 并忘记笨拙的 clone() 方法即可。

Is there a way to 'force' Java to return the concrete class type (Room, Door, Wall) eventhough the method from the abstract class is used? This may avoid castings.

使用泛型,是的,您可以做到。

例如:

public interface MapSite<T>{
T cloneIt();
}

public abstract class AbstractMapSite<T> implements MapSite<T>{
...
}


public class Wall extends AbstractMapSite<Wall>{
public Wall cloneIt(){
...
}
}

关于java - 实现在返回具体类的接口(interface)中定义的克隆吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43717732/

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