gpt4 book ai didi

java - 强制两个相似的类表现得好像它们在 Java 中是多态的

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:26 25 4
gpt4 key购买 nike

摘要:

我想与共享许多相似功能的两个类('Item' 和'Block')交互,就好像它们是从具有这些功能的接口(interface)实现的一样,但它们不是,我无法编辑它们。我有什么选择来处理这个问题?我是否一直在编写 super hacky 代码?

详细信息:

我正在使用 Java 开发 minecraft mod,使用 minecraft 的一部分是我无法编辑游戏的基本代码。游戏有两个基本类别; “Block”和“Item”,这两者共享许多功能,但是开发人员并没有让它们实现一个接口(interface)(我希望它们有)。

为了保持我的代码干净并避免大量 if 语句在处理 Blocks 和 Items 之间切换,我想将两者都保存在一个通用列表中,最好尽可能少地转换为 Block 或 Item,同时尝试保持可读性。

我目前的解决方案并不令人满意,它很难阅读,而且虽然它清除了一些代码重复,但我仍然必须强制转换返回类型。

更新:

根据Eran留下的答案我已经更新了针对此问题的解决方案,现在我发现这是令人满意的:

我创建了与 ItemOrBlockAdapter 接口(interface)并扩展 Block 和 Item 的适配器(采用注释中建议的适配器名称)类:

public interface ItemOrBlockAdapter {
public String myGetUnlocalizedName();
public ItemOrBlockAdapter mySetCreativeTab(CreativeTabs tab);
}

public class BlockAdapter extends Block implements ItemOrBlockAdapter {
protected BlockAdapter(String uid, Material m) {
super(m);
GameRegistry.registerBlock(this, uid);
}

public String myGetUnlocalizedName()
{
return this.getUnlocalizedName();
}

public ItemOrBlockAdapter mySetCreativeTab(CreativeTabs tab)
{
return (ItemOrBlockAdapter)this.setCreativeTab(tab);
}
}

这比我之前使用的 hacky 解决方案(每次调用都通过 Block 和 Item 方法查找所需的方法)要好得多!然而,这并非没有错误,我现在必须将我希望添加适配器的每个函数编写三次,如果其他东西继承了头适配器,则第四次。

我认为这个问题已经解决了,但我对更好的解决方案持开放态度,因为这涉及大量的代码重复(要知道我将不得不添加很多方法来完成这个问题,而不仅仅是上面所示的两个)。

最佳答案

您可以创建包装器类 - BlockWrapperItemWrapper。两者都将实现相同的接口(interface)(其中将包含 BlockItem 的常用方法)。 BlockWrapper 将包含一个 Block 实例,而 ItemWrapper 将包含一个 Item 实例。

示例:

public interface ItemOrBlock // think of a better name
{
public void func1();

public void func2();
}

public class BlockWrapper implements ItemOrBlock
{
private Block block;

public BlockWrapper (Block block) {
this.block = block;
}

public void func1()
{
block.func1();
}

public void func2()
{
block.func2();
}

}

ItemWrapper 会有类似的实现。

现在,如果您从 BlockItem 创建 BlockWrapperItemWrapper,您可以将它们放在 ItemOrBlock 的 Collection 中,并使用该接口(interface)调用它们的常用方法。

关于java - 强制两个相似的类表现得好像它们在 Java 中是多态的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26212415/

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