可实现的核心接口
From Apache OpenOffice Wiki
了解要实现的接口的位置是非常重要的。这里介绍的的接口位于组件的对象实现中。编写 UNO 组件时,所需的方法必须实现到应用程序中,还要使用核心接口与 UNO 环境通信。这些核心接口有的是强制性的,另外一些则是可选择的。
接口 | 必需 | 应该实现 | 可选 | 特殊情况 | C++ 和 Java 可用的 Helper 类 |
---|---|---|---|---|---|
XInterface | |||||
XTypeProvider | |||||
XServiceInfo | |||||
XWeak | |||||
XComponent | |||||
XInitialization | |||||
XMain | |||||
XAggregation | |||||
XUnoTunnel |
上表中的接口的特点已做过简要介绍。下面将详细介绍各个接口,并且还将说明帮助程序是否可用以及适用的情况。
- 没有这个接口,组件就不能工作。基接口
XInterface
提供对服务的更高层接口的访问,并允许其他对象通知服务何时不再需要它,以便它自行注销。
// com::sun::star::uno::XInterface any queryInterface( [in] type aType ); [oneway] void acquire(); // increase reference counter in your service implementation [oneway] void release(); // decrease reference counter, delete object when counter becomes zero
- 开发者通常不会显式调用
acquire()
,因为在通过UnoRuntime.queryInterface()
或Reference<destInterface>(sourceInterface,UNO_QUERY)
获取对组件的引用时,语言绑定会自动调用它。而与之相对应的release()
则是在引用超出范围(在 C++ 中)或垃圾收集器抛出包含引用的对象(在 Java 中)时被自动调用。
com.sun.star.lang.XTypeProvider
- 脚本语言(如 OpenOffice.org Basic)可以使用此接口来获取类型信息。没有它,OpenOffice.org Basic 将无法使用组件。
// com::sun::star::lang::XTypeProvider sequence<type> getTypes(); sequence<byte> getImplementationId();
-
XTypeProvider
和XServiceInfo
(下文)将来可能会过时,而另外还可能会出现语言绑定特别机制以用于查询对象的属性。
com.sun.star.lang.XServiceInfo
- 此接口由其他对象使用,以获取有关服务实现的信息。.
// com::sun::star::lang::XServiceInfo string getImplementationName(); boolean supportsService( [in] string ServiceName ); sequence<string> getSupportedServiceNames();
- 此接口允许客户端保持对对象的弱引用。如果其他客户端保持对对象的强引用,则弱引用不能保证该对象免受销毁,因此允许再次获取强引用。使用这项技术是为了避免循环引用。即使您不需要使用此接口,它也可以用于要对您的对象实例创建弱引用的客户端。
// com.sun.star.uno.XWeak com::sun::star::uno::XAdapter queryAdapter(); // creates Adapter
- 此接口在组件中发生循环引用时使用,这时组件包含另一个对象,而这个对象又包含对该组件的引用。可以在服务说明中指定由谁来销毁这个对象。
// com::sun::star::lang::XComponent void dispose(); //an object owning your component may order it to delete itself using dispose() void addEventListener(com::sun::star::lang::XEventListener xListener); // add dispose listeners void removeEventListener (com::sun::star::lang::XEventListener aListener); // remove them
com.sun.star.lang.XInitialization
- 此接口用于使其他对象可以与组件一起使用
createInstanceWithArguments()
或createInstanceWithArgumentsAndContext()
。应该实现此接口,并在initialize()
中处理参数:
// com::sun::star::lang::XInitialization void initialize(sequence< any > aArguments) raises (com::sun::star::uno::Exception);
- 此接口用于与 UNO 可执行文件一起使用,以从 OpenOffice.org 服务管理器独立地实例化组件。
// com.sun.star.lang.XMain long run (sequence< string > aArguments);
- 此接口用于实现在聚合中协作。如果实现此接口,其他对象可以聚合到实现中。已聚合的对象表现出的行为就像它们是一个对象。如果另一个对象聚合组件,它将包含组件并委托对该组件的调用,从而使组件看起来与聚合的对象是一体的。
// com.sun.star.uno.XAggregation void setDelegator(com.sun.star.uno.XInterface pDelegator); any queryAggregation(type aType);
- 此接口在向组件提供一个指针,指向同一个进程中的另一个组件。这可以通过使用
XunoTunnel
完成。XUnoTunnel
不应由新组件使用,因为如果其他全部失败,它将用于现有实现的集成。
至此,您应该能够确定要使用哪些接口了。有时,接口的取舍也要花费必要的精力。以下各节分别
讨论上述各个接口,介绍如何利用 Java 或 C++ 中预实现的帮助程序类,以及在各种语言中,可能的
实现必须包括哪些内容。
Content on this page is licensed under the Public Documentation License (PDL). |