我试图覆盖很多类的行为,所有类都扩展了同一个类。
示例类:
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
}
}
答案 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而无需装饰器。魔鬼在细节中:任何解决方案的细节都将直接取决于您的问题的细节。