组件实现

已向类型扩展点注册的组件与部件组件非常类似。它们可在其构造函数中使用一组依赖项,并且必须实现注册了它们的接口。以下示例显示 NullNameableService 的实现。

/**
 * Default implementation of the Nameable service. All methods are no-ops.
 *
 * @since 3.1
 */
public class NullNameableService implements INameable {

    /**
     * Component constructor. Do not invoke directly.
     */
    public NullNameableService() {}

    public void setName(String newName) {}
    public void setContentDescription(String contentDescription) {}
    public void setImage(ImageDescriptor theImage) {}
    public void setTooltip(String toolTip) {}
}

因为类不执行任何操作,所以这可能是一个简单的示例,然而,它演示了一个公共模式。INameable 服务用来将子代的某个状态告知父代。使用此类型的接口时,缺省实现通常不执行任何操作。这意味着:如果父代不关心其子代的状态,则可以忽略该父代。按照约定,我们使用“Null”前缀来指示这是一个不执行任何操作的组件。因为创建这种不重要对象的多个实例比较浪费,所以此类型的对象通常是作为单一类型注册的。客户机应确保用于报告状态的任何新接口都是支持多路复用的。

如果接口的目的是分配资源或生成输出,则缺省实现通常将执行更有用的操作。以下示例显示 DefaultMessageDialogs 类的实现。由于此类用于生成交互式输出,因此它具有一个有用的缺省实现且不支持多路复用。由于此类需要访问部件的组合体,因此,它不能是单一的。按照约定,我们使用类前缀“Default”来指示这是一个具有某些有用行为的缺省组件。

/**
 * Default implementation of the IMessageDialogs interface. Takes the part's
 * control as context and allows the part to open dialogs in a child shell.
 *
 * @since 3.1
 */
public class DefaultMessageDialogs implements IMessageDialogs {

    private Composite control;
   
    /**
     * Component constructor. Do not invoke directly.
     */
    public DefaultMessageDialogs(Composite control) {
        this.control = control;
    }
   
    public void open(IStatus message) {
        if (message.getSeverity() == IStatus.ERROR) {
            ErrorDialog.openError(control.getShell(), null, null, message);
        } else {
            open(message.getSeverity(), message.getMessage());
        }
    }

    public void openError(String message, Throwable cause) {
        open(new Status(IStatus.ERROR,
                WorkbenchPlugin.getDefault().getBundle().getSymbolicName(),
                IStatus.OK,
                message,
                cause));
    }
   
    public void open(int severity, String message) {
        if (severity == IStatus.ERROR) {
            MessageDialog.openError(control.getShell(), null, message);
        } else if (severity == IStatus.WARNING) {
            MessageDialog.openWarning(control.getShell(), null, message);
        } else {
            MessageDialog.openInformation(control.getShell(), null, message);
        }   
    }
}

以下是 DefaultMessageDialog 的相关联的扩展点标记。

<extension point="org.eclipse.core.component.types">
      <component
            initializer="org.eclipse.ui.part.SiteInitializer"
            interface="org.eclipse.ui.part.services.IMessageDialogs"
            implementation="org.eclipse.ui.internal.part.services.DefaultMessageDialogs"
            singleton="false"/>
</extension>