Ale*_*nes 6 java oop polymorphism inheritance
抽象:
我想与两个类('Item'和'Block')进行交互,这两个类共享许多类似的功能,就好像它们是从具有这些功能的接口实现的,但它们不是,我无法编辑它们.有什么办法可以解决这个问题?我是不是写了超级hacky代码?
细节:
我正在使用Java编写一个minecraft mod,使用minecraft的一部分是我无法编辑游戏的基本代码.游戏有两个基本类别; "块"和"项目",这两者共享许多功能,但开发人员没有让它们实现一个接口(我希望他们有).
为了保持我的代码清洁并避免在处理块和项目之间切换很多if语句,我希望将它们保存在通用列表中,最好尽可能少地转换为Block或Item,同时尝试保持可读性.
我目前的解决方案不能满足一个好的解决方案,它很难阅读,虽然它清理了一些代码重复,但仍然需要转换返回类型.
更新:
基于Eran留下的答案,我已经更新了我对此问题的解决方案,现在我发现这是令人满意的:
我创建了与ItemOrBlockAdapter和扩展块和项接口的适配器(采用注释中建议的适配器名称)类:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
这比我之前使用的hacky解决方案要好得多(通过Block和Item方法查找每个调用所需的方法)!然而,它并非没有错,我现在必须编写我希望添加适配器三次的每个函数,如果其他东西继承了头适配器,则第四次.
我认为这已经解决了,但我对优秀的解决方案持开放态度,因为这涉及到相当多的代码重复(理解我将不得不添加许多方法来完成这些,而不仅仅是如上所示的两个方法).
您可以创建包装类 - BlockWrapper和ItemWrapper.两者将实现相同的接口(其中将包括的常用方法Block和Item).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();
}
}
Run Code Online (Sandbox Code Playgroud)
ItemWrapper 会有类似的实施.
现在,如果你从s和s 创建BlockWrappers和ItemWrappers ,你可以将它们放在Collection of中,并使用该接口来调用它们的常用方法.BlockItemItemOrBlock