Komponensmegvalósítás

A types kiterjesztési ponttal bejegyzett komponensek sok tekintetben hasonlítanak a részkomponensekhez. A konstruktorukban függőségek halmazát fogadhatják, és meg kell valósítaniuk azt a felületet, amelyhez bejegyzésre kerültek. Ez a példa a NullNameableService megvalósítását mutatja be.

/**
 * A Nameable szolgáltatás alapértelmezett megvalósítása. Az összes metódus no-op.
 *
 * 3.1 változat óta
 */
public class NullNameableService implements INameable {

    /**
     * A komponens konstruktora. Ne hívja meg közvetlenül.
     */
    public NullNameableService() {}

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

Ez egy egyszerű példa, mert az osztály nem csinál semmit, azonban bemutat egy általános mintát. Az INameable szolgáltatás használatával a szülő számára állapotinformációkat adhatunk az utódról. Az ilyen típusú felület esetén az alapértelmezett megvalósítás jellemzően nem csinál semmit. Ennek van értelme, ugyanis, ha a szülőt nem érdekli az utódjának állapota, akkor figyelmen kívül hagyhatja. Megállapodás szerint a "Null" előtagot használjuk az olyan komponens jelzésére, amely nem csinál semmit. Az ilyen típusú objektum általában egykeként kerül bejegyzésre, mivel pazarlás lenne több példányt létrehozni ilyen jelentéktelen objektumból. Az ügyfeleknek biztosítaniuk kell, hogy az állapotot jelentő új felületeket többszörözni lehessen.

Ha a felület célja az erőforrások lefoglalása vagy kimenetek előállítása, akkor az alapértelmezett megvalósítás jellemzően valami hasznosabbat tesz. Az alábbi példa a DefaultMessageDialogs osztály megvalósítását mutatja be. Mivel ez az osztály interaktív kimenet előállítását végzi, ezért egy hasznos alapértelmezett megvalósítással rendelkezik és nem támogatja a többszörözést. Mivel ennek az osztálynak hozzá kell férnie a rész összetételéhez, ezért nem lehet egyke. Megállapodás szerint a "Default" osztályelőtagot használjuk annak jelzésére, hogy egy alapértelmezett komponensről van szó valamilyen hasznos viselkedéssel.

/**
 * Az IMessageDialogs felület alapértelmezett megvalósítása. A részek
 * vezérlőelemét fogadja kontextusként és lehetővé teszi a rész számára párbeszédablakok megnyitását egy utód parancsértelmezőjében.
 *
 * 3.1 változat óta
 */
public class DefaultMessageDialogs implements IMessageDialogs {

    private Composite control;
   
    /**
     * A komponens konstruktora. Ne hívja meg közvetlenül.
     */
    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);
        }   
    }
}

Ez a DefaultMessageDialog osztályhoz tartozó kiterjesztési pont kódja.

<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>