强制两个相似的类的行为就好像它们在Java中是多态的一样

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方法查找每个调用所需的方法)!然而,它并非没有错,我现在必须编写我希望添加适配器三次的每个函数,如果其他东西继承了头适配器,则第四次.

我认为这已经解决了,但我对优秀的解决方案持开放态度,因为这涉及到相当多的代码重复(理解我将不得不添加许多方法来完成这些,而不仅仅是如上所示的两个方法).

Era*_*ran 6

您可以创建包装类 - BlockWrapperItemWrapper.两者将实现相同的接口(其中将包括的常用方法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();
    }

}
Run Code Online (Sandbox Code Playgroud)

ItemWrapper 会有类似的实施.

现在,如果你从s和s 创建BlockWrappers和ItemWrappers ,你可以将它们放在Collection of中,并使用该接口来调用它们的常用方法.BlockItemItemOrBlock

  • 适配器是此模式的名称.包装器不是不正确的,但是更通用的术语. (2认同)
  • 对我来说看起来像适配器模式.http://en.wikipedia.org/wiki/Adapter_pattern (2认同)