快速业务通道

IAdaptable是什么? - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
知道了这个类型, 何不直接修改接口声明呢?其实有很多原因使得你并不希望直接编辑这个类(例如更容易保 持向下兼容性),也不想改变它的类型(HashMap虽然不是一个List,但可以转换过去)。

Eclipse通过PlatformObject抽象类来解决以上问题,它为你实现了IAdaptable接口, Eclipse平台(Platform)提供了IAdapterManager的一个实现,并且可以通过 Platform.getAdapterManager()访问到,它把所有对getAdapter()的请求(调用)委托给一 个名为IAdapterManager的东西。你可以将它想象为一个巨大的保存着类和adapter信息的Map ,而PlatformObject的getAdapter()方法会查找这个Map。

适配已存在的类

这样,PlatformObject不需要重新编译就能够支持新的adapter类型,这一点在Eclipse里 被大量使用以支持workspace的扩展点。

现在假设我们想要将一个只包含String类型元素的List转换为一个XMl节点,这个节点的 格式如下:

<List>   <Entry>First String</Entry>   <Entry>Second String</Entry>   <Entry>Third String</Entry> </List>

IAdaptable是什么?(3)

时间:2011-04-30 八进制译

因为toString()方法可能有其他用途,我们不能通过覆盖toString()方法来实现这个功能 。所以,我们要给List关联一个工厂类以处理XML节点类型的适配请求。要管理工厂类需要以 下三个步骤:

1、由List生成一个Node,我们把这个转换过程用IAdapterFactory包装起来:

import nu.xom.*; public class NodeListFactory implements IAdapterFactory {   /**//* 可以转换到的类型 */   private static final Class[] types = {    Node.class,   };   public Class[] getAdapterList() {    return types;   }   /**//* 转换到Node的功能代码 */   public Object getAdapter(Object list, Class clazz) {    if (clazz == Node.class && list instanceof List) {     Element root = new Element("List");     Iterator it = list.iterator();     while(it.hasNext()) {      Element item = new Element("Entry");      item.appendChild(it.next().toString());      root.appendChild(item);     }     return root;    } else {     return null;    }   } }

2、把这个工厂类注册到Platform的AdapterManager,这样当我们希望从List的实例中获 得一个Node实例时,就会找到我们的工厂类。注册一个工厂类的方式也很简单:

Platform.getAdapterManager().registerAdapters(   new NodeListFactory(), List.class );

这条语句将NodeListFactory关联到List类型。当从List里请求adapter时,Platform的 AdapterManager会找到NodeListFactory,因为在后者的getAdapterList()方法的返回结果里 包含了Node类,所以它知道从List实例得到一个Node实例是可行的。在Eclipse里,这个注册 步骤一般是在plugin启动时完成的,但也可以通过org.eclipse.core.runtime.adapters扩展 点来完成。

3、从List获得Node,下面是例子代码:

Node getNodeFrom(IAdaptable list) {   Object adaptable = list.getAdapter(Node.class);   if (adaptable != null) {    Node node = (Node)adaptable;    return node;   }   return null; }

总结

综上所述,要在运行时为一个已有的类增加功能,所要做的只是定义一个用来转换的工厂 类,然后把它注册到Platform的AdapterManager即可。这种方式在保持UI组件和非UI组件的 分离方面特别有用。例如在org.rcpapps.rcpnews.ui和org.rcpapps.rcpnews这两个plugin里 ,前者的IPropertySo

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号