问题可能是一个愚蠢的问题但是,请帮助我。 我需要覆盖类的行为,但我只会得到它的对象。 以下是代码示例。
我想在所有地方使用方法Util.newChildComponent(String id)本身。
class ParentComponent{
public ParentComponent(String id){}
protected void someBehavior(){}
}
class ChildComponent extends ParentComponent{
public ChildComponent(String id){
super(id);
}
protected void childsBehavior(){}
}
public class Util {
public static ParentComponent newChildComponent(String id)
{
ParentComponent fc = new ChildComponent(id);
// Initialize the object, and performs some common configuration.
// Performs different operations on the generated child object.
// The child class has many members apart from childsBehavior().
return fc;
}
}
// The above classes belongs to a jar, so I cannot edit the code.
// I need to use Util.newChildComponent(String id)
// But I need to override the behavior as mentioned below.
public void f1()
{
// TODO: How to override childsBehavior() method using the object
// I have it in pc? Is it possible?
// Util.newChildComponent(id) method decorates the ChildComponent
// So I need to use the same object and just override childsBehavior() method only.
ParentComponent pc = Util.newChildComponent("childId");
// I need to achieve the result below
/*
ParentComponent pc = new ChildComponent(id){
@Override
protected void childsBehavior(){
super.someBehavior();
// Do the stuff here.
}
}; */
}
提前致谢。
答案 0 :(得分:2)
听起来你正在寻找DynamicObjectAdaptorFactory。
这是他出色的物品的用途。
static class ParentComponent {
protected void someBehavior() {
System.out.println("ParentComponent someBehavior");
}
}
static class ChildComponent extends ParentComponent {
private ChildComponent(String id) {
}
protected void childsBehavior() {
System.out.println("childsBehavior");
}
}
public static class Util {
public static ParentComponent newChildComponent(String id) {
ParentComponent fc = new ChildComponent(id);
// Initialize the object, and performs some common configuration.
return fc;
}
}
interface Parent {
void someBehavior();
}
// The adaptor.
public static class Adapter implements Parent {
final ParentComponent parent;
private Adapter(ParentComponent pc) {
this.parent = pc;
}
// Override the parent behaviour.
public void someBehavior() {
System.out.println("Adapter invoke someBehaviour()");
parent.someBehavior();
System.out.println("Adapter finished someBehaviour()");
}
}
public void test() {
ParentComponent pc = Util.newChildComponent("childId");
Parent adapted = DynamicObjectAdapterFactory.adapt(pc, Parent.class, new Adapter(pc));
adapted.someBehavior();
}
打印:
Adapter invoke someBehaviour()
someBehavior
Adapter finished someBehaviour()
答案 1 :(得分:1)
看一下Java的动态代理。这应该允许您通过创建调用处理程序来处理对方法的调用,从而在运行时更改行为。如果需要,您甚至可以将其转发到原始方法。
答案 2 :(得分:1)
声明一个新类,使用您想要更改的方法扩展该类
public class MyClass extends ChildComponent {
@Override
protected void childsBehavior()
{
.....
}
}
然后在您的代码中,您可以使用强制转换,这是我们通过继承享受的功能
MyClass pc =(myClass)Util.newChildComponent(“childId”);
但是你必须像这样创建新对象
MyClass pc = new MyClass("childId");
并在Util
处完成手动配置。除非您扩展Util
并创建一个创建MyClass
对象的方法并在那里复制配置代码。
现在pc
将拥有ParentComponent
和ChildComponent
的所有方法,但childsBehavior
将是您声明的内容。
答案 3 :(得分:0)
如果您不想更改使用Util
来实例化所需对象的代码,可以使用您需要的行为重写Util
类(即实例化扩展的类{ {1}}使用重写方法),只需记住将其放在项目中具有相同名称的包中(以便其客户端的导入不会更改)。这样就没有其他代码可以改变了。