Dodawanie nowych interfejsów

Nowe typy obiektów można wprowadzić do konstruktora danej części przez zarejestrowanie ich w punkcie rozszerzenia org.eclipse.core.component.types. W tym miejscu należy wprowadzić termin komponent. Komponent to każdy obiekt utworzony w punkcie rozszerzenia przez wprowadzenie argumentów do jego konstruktora. Części, należące do nowego stylu, są jednym z rodzajów komponentów, ale istnieją także inne ich typy.

Poniżej przedstawiono przykład rozszerzenia typów. Określono w nim, że interfejs INameable jest dostępny w serwisie danej części.

<extension
      point="org.eclipse.core.component.types">
   <component
         initializer="org.eclipse.ui.part.SiteInitializer"
         interface="org.eclipse.ui.part.services.INameable"
         implementation="org.eclipse.ui.internal.part.services.NullNameableService"
         singleton="true"
   />
</extension>

Atrybut initializer wskazuje miejsce, w którym interfejs będzie używany. Na przykład łańcuch "org.eclipse.ui.part.SiteInitializer" oznacza, że interfejs będzie używany w serwisie danej części. Użycie łańcucha "org.eclipse.ui.part.PartInitializer" oznaczałoby, że interfejs będzie implementowany przez same części.

Atrybut interface stanowi nazwę interfejsu. Musi ona odpowiadać typowi, który dany komponent otrzyma w konstruktorze. Jeśli utworzone rozszerzenie dostarcza łańcuchy, a komponent wymaga obiektów, dane rozszerzenie nie zostanie użyte pomimo zgodności typów.

Atrybut implementation identyfikuje domyślną implementację interfejsu. Wskazuje on albo na klasę komponentów, która implementuje interfejs, albo na właściwość ComponentFactory, która może je utworzyć. Aby uzyskać więcej informacji, patrz sekcja ComponentFactory. Ta implementacja jest używana do spełnienia warunków zależności w przypadku, gdy komponent zażąda tego interfejsu, a nie będzie można go znaleźć w kontekście nadrzędnym. Wszystkie interfejsy muszą dostarczać domyślną implementację. Oznacza to, że poprawnie napisany komponent będzie zawsze działał w danym zasięgu niezależnie od liczby zależności dostarczanych przez kontekst nadrzędny. Implementacja nie może przesłonić ani rozszerzyć atrybutu interface przez zaimplementowanie dodatkowych interfejsów. Inne komponenty mogą zależeć od tego komponentu przez jego zarejestrowany interfejs, ale nie mogą zależeć bezpośrednio od klasy implementacji.

Atrybut singleton wskazuje, czy domyślna implementacja jest typem singleton. Jeśli atrybut ten ma wartość true, zostanie utworzona tylko jedna implementacja, która będzie współużytkowana przez wszystkie komponenty, które jej wymagają. Jeśli atrybut ten ma wartość false, nowa implementacja zostanie utworzona dla każdego kontenera, który jej wymaga. Na przykład w przypadku części łańcuch singleton=:"false" oznacza, że dla każdej części zostanie utworzona tylko jedna implementacja.