Komponentenimplementierung

Komponenten, die mit dem Typerweiterungspunkt registriert sind, sind Abschnittkomponenten sehr ähnlich. Sie können eine Gruppe von Abhängigkeiten in ihrem Konstruktor enthalten und müssen die Schnittstelle implementieren, für die sie registriert waren. Dieses Beispiel zeigt die Implementierung der NullNameableService.

/**
 * Standardmäßige Implementierung von Nameable Service. Alle Methoden sind Pflicht.
 *
 * @Ab 3.1
 */
public class NullNameableService implements INameable {

    /**
     * Komponentenkonstruktor. Nicht direkt aufrufen.
     */
    public NullNameableService() {}

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

Dies mag ein einfaches Beispiel sein, da die Klasse nichts macht, es zeigt jedoch ein allgemeines Muster. Der INameable Service dient dazu, dem übergeordneten Element etwas über einen Status im untergeordneten Element zu sagen. Bei diesem Schnittstellentyp macht die standardmäßige Implementierung üblicherweise nichts. doesn't do anything. Dies macht Sinn: wenn sich das übergeordnete Element nicht um den Status seines untergeordneten Elements kümmert, kann es ignoriert werden. Gemäß Konvention verwenden wir das Präfix "Null", um anzuzeigen, d ass dies eine Komponente ist, die nichts macht. Dieser Objekttyp wird gewöhnlich als Single registriert, da es verschwenderisch wäre, mehrere Instanzen eines solch trivialen Objekts zu erstellen. Clients sollten sicherstellen, dass alle neuen Schnittstellen, die den Status melden, multiplexed werden können.

Wenn es der Zweck der Schnittstelle ist, Ressourcen zuzuordnen oder eine Ausgabe zu generieren, macht die standardmäßige Implementierung üblicherweise etwas sinnvolleres. Das folgende Beispiel zeigt die Implementierung der Klasse 'DefaultMessageDialogs'. Da diese Klasse dazu dient, eine interaktive Ausgabe zu generieren, hat sie eine nützliche Standardimplementierung und würde kein Multiplexing unterstützen. Da die Klasse den Zugriff auf die Kombination eines Abschnitts erfordert, kann sie kein Single sein. Gemäß Konvention verwenden wir das Präfix "Standard" um anzuzeigen, dass dies eine Standardkomponente mit einem nützlichen Verhalten ist.

/**
 * Standardimplementierung der Schnittstelle 'IMessageDialogs'. Übernimmt die Steuerung
 * des Abschnitts und ermöglicht dem Abschnitt, Dialoge in einer untergeordneten Shell zu öffnen.
 *
 * @Ab 3.1
 */
public class DefaultMessageDialogs implements IMessageDialogs {

    private Composite control;
   
    /**
     * Komponentenkonstruktor. Nicht direkt aufrufen.
     */
    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);
        }   
    }
}

Hier ist das zugeordnete Formatierungssteuerzeichen des Erweiterungspunkts für 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>