如何在Java中可变地扩展类

时间:2015-08-23 15:01:58

标签: java events event-handling

我试图覆盖很多类的行为,所有类都扩展了同一个类。

示例类:

public void example extends Gui {
    public void draw() {
        //Draws some stuff
    }
    public void exit() {
        //Exits
    }
    private void handleMouseInput() {
        //Handles mouse input
    }
    public void handleKeyInput() {
        //Handles keyinput
    }
}

我有一个事件处理程序,每次打开Gui时,GUI首先通过事件处理程序传递。 我想采用GUI,并使用我自己的代码覆盖handleKeyInput()方法,因为它们来自事件处理程序。通过事件处理程序的所有GUI都有相同的方法。

我想创建一个方法/类,它接受一个Gui作为它的参数,并返回一个新的Gui,并修改了handleKeyInput()。通过这种方式,我可以创建一个适用于所有Gui的通用键绑定,而无需一次手动修改所有这些绑定。

public static Gui changeKeyInput(Gui guiToModify) {
    return guiToModify with handleKeyInput() modified;
}

一个简单的例子(虽然不可能)是:

public class randomGui extends variableA 
    Gui variableA;

    public randomGui(Gui variableA) {
        this.variableA = variableA;
    }

    @Override
    public void handleKeyInput() {
        //MyCustomCode
    }
}

1 个答案:

答案 0 :(得分:2)

也许您想要使用Decorator Design Pattern,类似于Java与InputStreams和OutputStreams的使用 - 其中Java允许您将InputStreams装饰为BufferedInputStreams等,并根据需要添加功能。您可以将对象传递给装饰器的构造函数,它应该通过简单委派使用对象的未更改方法,并允许您更改要更改的方法。

public class DecoratorTest {
    public static void main(String[] args) {
        MyDecorator myDecorator = new FirstClass();
        testDecorator(myDecorator);

        System.out.println();
        myDecorator = new SecondClass(myDecorator);
        testDecorator(myDecorator);
    }

    private static void testDecorator(MyDecorator myDecorator) {
        myDecorator.stableMethod1();
        myDecorator.stableMethod2();
        myDecorator.changedMethod();
    }
}

interface MyDecorator {
    void stableMethod1();
    void stableMethod2();
    void changedMethod();
}

class FirstClass implements MyDecorator {

    @Override
    public void stableMethod1() {
        System.out.println("in stableMethod1 of FirstClass");
    }

    @Override
    public void stableMethod2() {
        System.out.println("in stableMethod2 of FirstClass");
    }

    @Override
    public void changedMethod() {
        System.out.println("in  changedMethod of FirstClass");
    }

}

class SecondClass implements MyDecorator {
    private MyDecorator loadedObj;

    public SecondClass(MyDecorator loadedObj) {
        this.loadedObj = loadedObj;
    }

    @Override
    public void stableMethod1() {
        loadedObj.stableMethod1();
    }

    @Override
    public void stableMethod2() {
        loadedObj.stableMethod1();
    }

    @Override
    public void changedMethod() {
        System.out.println("in  changedMethod of SecondClass");
    }

}

但是请注意,如果您只想更改键绑定,则可能不需要这样做,因为您可以删除并将键绑定添加到JComponent而无需装饰器。魔鬼在细节中:任何解决方案的细节都将直接取决于您的问题的细节。