各位大神:
     小弟现在有一非常蛋疼的问题,提出来给大家探讨下。现我在代码中用一开源库生成了一个类A的对象a,这个小a我将会在别的地方使用。但是,光a的功能不足以满足我的使用,所以想为A添加一些功能,而同时我不希望修改开源库的代码,因为这样有可能以后每次升级开源库都要改代码。请问我怎样在不修改开源库代码的情况下,为A(或者说a)添加功能(方法)。
本来考虑过decorator模式,新建类B,使用B实现A的所有接口,然后再增加功能;其中B的对象b,使用a进行初始化,只要调用A的接口,就使用b对象调用其a对象完成功能,调用添加的功能就使用b对象。但是发现类A的父类有很多(很多层),且几乎每一层都有实现的接口,那这样我的B类就要实现十几个接口,太复杂,所以想能不能有一种方法使B继承A,并为其添加功能。然后使用开源库生成a,再将a转化为b(下转型)。
不过由于向下转型报错,目前不能实现,想请教坛子里的大神,有没有其他办法小弟拜谢!javadecorator下转型

解决方案 »

  1.   

    说具体点吧,我现在在用Rhino引擎解析js脚本。假设有这么一段js:“document.getElementById("pp");”。Rhino引擎在见到这句话的时候,他是不认识document这个变量的,需要我在运行这段脚本之前,将document的引用加入Rhino运行域。说简单点就是告诉Rhino如果看见document这个变量,他需要去哪里找这个变量对应的java对象。
    由此,当做完准备工作,使用Rhino运行上面的脚本,Rhino会找到document所引用的java对象,并调用java对象的getElementById方法。现在就是我遇到的问题了,我使用apache的开源库生成了document对象(这个对象生成可不容易啊.........),然后我将这个生成的对象介绍给Rhino认识,这样它就知道什么时候调用document了。但是,apache生成的document还不足以满足我的需求。如果有这么一句脚本“document.myMethod();”,由于apache的document没有这个方法,运行就会出异常。所以我必须在已经生成了apache的document的基础上,为他添加myMethod方法。
    这就是难点啦..............我希望扩充后的对象(叫他kdocument吧),又可以当document使用,又可以当kdocument使用..................。
    有点像继承,但是是已经有了父对象后,将父对象转化为子对象的继承,就是下转型..............这个java会报错,所以现在寻求其他的解决办法。
      

  2.   

    是继承,不过一般的继承是类B继承了类A,然后初始化B的对象b,这时候b就又有A对象的方法,由于xine添加的方法了.........   
    不过我现在是,父类A对象a已经有了,然后为a添加新的方法....................有点像动态添加方法的感觉哦.............
      

  3.   

    如果B是继承于A那么如果你获得的b对象有A的方法,这没问题,但是A肯定不会有B的方法。转换是否报错决定于你这个对象到底是A还是B,如果是A你要转换成B那么肯定要出错的,如果原本就是B,虽然之前你一直当A来使用,但是他原本就是B,所以你转换成B是不会有问题的。这个主要看你包里面是怎么创建A对象的,如果是通过反射配置className的话,那你改成B的className就可以了,如果直接创建的A的话那么你只有改源码。或者说你需要用到B的地方直接创建B
      

  4.   

    class B{
    A a = new A() //自己选择适合注入方式.//随便包装一下A的方法
    public void C(int i){
       a.C(i);
    }public String D(String s){
        return a.D(s);
    }
    //这个是B自己的方法
    public String E(String ss){
        return;
    }}
      

  5.   

    你这种方法是我最先想到的,不过a的方法非常之多,估计差不多有上百个  这样的话我的b所有方法都要写封装非常麻烦,而且一旦开源库对生成的a有所更改,我就必须修改b的代码,后期维护成本很高呢............  不过实在不行这也是一种解决之道    呵呵
      

  6.   


    终极方法。不过每次A更新都需要改一句代码。
    class B {
    //自己的方法
    }
    然后让A的终极父类去继承B。然后就行了。不过每次更新都要extends B.