是否可以让类A
使用空方法说render()
..然后你创建3个类的实例,所以你有对象b, c, d
,所以我可以分配每个对象的渲染方法的主体?
以下是一个示例,在JavaScript中,您可以让对象说a
,然后在任何可以说的地方
a.method = function() { /* do something */ }
在该行之后,您将拥有一个名为method
的方法,用于对象a
,并且只要它被调用/* do something */
。
这在Java中是否可行,语法是什么?
我的想法是拥有一个button
类,并在其使用的不同情境/上下文中为其实例的click
方法分配不同的操作,因此我不必定义不同的子类对于每个动作。
答案 0 :(得分:7)
在Java中,你无法在Javascript中传递函数。
您需要创建一个名为Handler
的类或接口(最好是更具描述性的内容!),它声明您要调用的方法。然后你可以做类似的事情:
a.method = function() { /* do something */ }
但你必须将其表述为
a.method = new Handler() {
public void function() {
/* do something */
}
};
并将其称为a.method.function()
。
我的想法是拥有一个
button
类,并在其使用的不同情境/上下文中为其实例的click
方法分配不同的操作,所以我没有为每个操作定义不同的子类。
这正是Swing的表现。它通常看起来像这样:
myButton.setAction(new AbstractAction("Click me!") {
public void actionPerformed() {
// do something
}
});
答案 1 :(得分:3)
您可以非常实例化A
类的子类,并覆盖您喜欢的方法。像这样
A a = new A(){
@Override
public void render(){
//do something
}
};
A b = new A(){
@Override
public void render(){
//do something
}
}
答案 2 :(得分:1)
在实例化类A
之后,您无法定义方法体,但您可以在实例化时定义方法体。
interface A {
void method();
}
A b = new A() {
@Override
public void method() {
//body for instance b
}
};
A c = new A() {
@Override
public void method() {
//body for instance c
}
};
答案 3 :(得分:1)
不,你不能用Java做到这一点。方法的实现完全取决于其对象的运行时类型。
但您可以使用策略模式,它实际上是由标准Swing框架完成的(或多或少):您可以将Action
设置为JButton
,并{{1单击按钮时会调用Action
方法。它只是对象之间的委托。
答案 4 :(得分:1)
如果您只想实例化具有render方法的类的一个对象,则可以使用委托;如果班级是重量级的话,你可能想要这样做。
这实际上是策略模式:
class MyClass {
private Behavior behavior;
public void setBehaviour(Behavior someBehaviour) {
this.behavior = someBehavior;
}
public void render() {
behavior.render();
}
}
interface Behavior {
void render();
}
class BehaviorA implements Behavior {
public void render() {
//do behavior A
}
}
class BehaviorB implements Behavior {
public void render() {
//do behavoir B
}
}
class RunnerClass {
public static void main(String[] args) {
MyClass myClass = new MyClass();
myClass.setBehavior(new BehaviorA()); //actually you should put a factory for behavioir
myClass.render();//render A logic is done
myClass.setBehavior(new BehaviorB());
myClass.render();//render B logic is done
}
}
答案 5 :(得分:0)
嗯,说实话,听起来像java中的纯多态,可以通过两种方式实现:
要么创建一个公共接口,每个对象实现不同的
定义一个抽象类按钮并创建b,c,d按钮,该按钮扩展抽象按钮并以不同方式定义每个按钮的行为。
http://java.sys-con.com/node/37695
http://www.javaworld.com/javaworld/javatips/jw-javatip30.html