0

这一切都在 JBox2D 的上下文中(在 Java 中)。World 类使用函数创建 Body 实例。我正在尝试为我的应用程序向 Body 添加更多内容。在这个问题中,主体由 ComplexClassWithLotsOfAPI 表示。

这是一个笼统的问题。我试图通过扩展类来为预制类添加更多功能。我希望做这样的事情:

class SomeMore extends ComplexClassWithLotsOfAPI{
    int myExtraInt;
    //A bit more API functions
}

这样我就可以这样做:

SomeMore sm=new SomeMore();
sm.someOldAPI();
sm.butAlsoMyNewAPI();

问题是这个 ComplexClassWithLotsOfAPI 是由另一个我无法修改的类(原始上下文中的 World 类)创建的,所以我不是简单地自己创建它们(否则这会起作用)。由于我不得不从 ComplexClassWithLotsOfAPI 开始,我一直在寻找一种从 SuperClass构造SubClass 的方法,而有许多将 SuperClass转换为 Subclass 的示例(但这在这里不适用)。下面是一个需要完成的功能示例:

public SomeMore create(...){ 
    ComplexClassWithLotsOfAPI ccwlao=myWorld.create(...);
    SomeMore sm;
    //??
    return sm;
}

包装的替代品? 我最初的解决方案是将 ComplexClassWithLotsOfAPI 封装到我自己的类中。为了构造我的新类,我只需将旧类传递给我的新构造函数并继续:

class SomeMore{
    public ComplexClassWithLotsOfAPI ccwloa;
    int myExtraInt;
    public SomeMore(ComplexClassWithLotsOfAPI nccwloa){
        ccwloa=nccwloa;
        myExtraInt=0;
    }
    //A bit more API functions
}
public SomeMore create(...){ 
    ComplexClassWithLotsOfAPI ccwlao=myWorld.create(...);
    SomeMore sm=new SomeMore(ccwlao);
    return sm;
    //OR more simply
    //return new SomeMore(myWorld.create(...));
}

但为了访问旧 API,我需要这样做:

SomeMore sm=new SomeMore();
sm.ccwloa.someOldAPI();
sm.butAlsoMyNewAPI();

我可能有点不合理,但是这种功能很乏味,并且给不需要它的东西增加了更多的复杂性。我的意思是,如果有人想添加更多功能,他们会将我的类包装到另一个类中,并通过 3 个类层次结构来获取旧 API?此外,将旧类中的每个 API 都包装到我的新类中会感觉很浪费(其中有很多)。

sm.someOldAPIButWrappedInMyClass(); //not desirable

我无法访问 ComplexClassWithLotsOfAPI 的 java 文件,只能访问已编译的类文件。我不能简单地将我的修改强加到旧类中(即使可以,我也不想这样做)。我对java比较陌生,所以也许这不是最好/正确的方法,但我一直无法找到替代方法。

4

1 回答 1

1

Eclipse 可以为您构建一个委托类,它是某个类(即父类)的子类,并在字段中保存一个“父类”实例(称为受委托者),并生成覆盖“父类”中所有方法的方法,并调用受委托人中的相同方法。然后,您可以添加自己的方法。

您可以从上下文菜单 Source 选项中执行此操作,生成委托方法。您必须拥有子类并让它扩展“Parent”并拥有“Parent”类型的字段才能让代码生成器工作。

这是一个例子:

/** Example class delegating to a contained variable */
public class DelegatingComparator implements Comparator<String> {
    // Delegatee has to be present before letting Eclipse generate
    private Comparator<String> delegatee;

    /** My own method extends Comparator methods */
    public int compareToFoo(String o1) {
        return compare(o1, "foo");
    }

    /** Generated by Eclipse. Source > Generate getters and setters */
    public void setDelegatee(Comparator<String> delegatee) {
        this.delegatee = delegatee;
    }

    /** Generated by Eclipse. Source > Generate Delegate Methods */
    public int compare(String o1, String o2) {
        return delegatee.compare(o1, o2);
    }

    /** Generated by Eclipse. Source > Generate Delegate Methods */
    public boolean equals(Object obj) {
        return delegatee.equals(obj);
    }

}
于 2013-01-18T22:54:39.857 回答