元件實作方式

用類型延伸點登錄的元件和組件元件非常相像。 它們可以在建構子中採用一組相依關係,且必須實作所要登錄的介面。本例顯示 NullNameableService 的實作方式。

/**
 * Nameable 服務的預設實作。所有方法都是 no-ops。
 *
 * @自 3.1
 */
public class NullNameableService implements INameable {

    /**
     * 元件建構子。不要直接呼叫。
     */
    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 來指出這是具有一些有用行為的預設元件。

/**
 * IMessageDialogs 介面的預設實作。
 * 將組件的控制項當成環境定義,並容許組件在子項 Shell 中開啟對話框。
 *
 * @自 3.1
 */
public class DefaultMessageDialogs implements IMessageDialogs {

    private Composite control;
   
    /**
     * 元件建構子。不要直接呼叫。
     */
    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>