Das Eclipse Modeling Framework hat eine interessante Idee, die auch die Vererbung berücksichtigt. Das Grundkonzept ist in der Switch- Schnittstelle definiert : Das Umschalten erfolgt durch Aufrufen der doSwitch- Methode.
Was wirklich interessant ist, ist die Implementierung. Für jede Art von Interesse a
public T caseXXXX(XXXX object);
Methode muss implementiert werden (wobei eine Standardimplementierung null zurückgibt). Die doSwitch- Implementierung versucht, alle caseXXX- Methoden für das Objekt für alle Typhierarchien aufzurufen . Etwas in den Zeilen von:
BaseType baseType = (BaseType)object;
T result = caseBaseType(eAttribute);
if (result == null) result = caseSuperType1(baseType);
if (result == null) result = caseSuperType2(baseType);
if (result == null) result = caseSuperType3(baseType);
if (result == null) result = caseSuperType4(baseType);
if (result == null) result = defaultCase(object);
return result;
Das eigentliche Framework verwendet für jede Klasse eine Ganzzahl-ID, sodass die Logik tatsächlich ein reiner Schalter ist:
public T doSwitch(Object object) {
return doSwitch(object.class(), eObject);
}
protected T doSwitch(Class clazz, Object object) {
return doSwitch(getClassifierID(clazz), object);
}
protected T doSwitch(int classifierID, Object theObject) {
switch (classifierID) {
case MyClasses.BASETYPE:
{
BaseType baseType = (BaseType)object;
...
return result;
}
case MyClasses.TYPE1:
{
...
}
...
Sie können sich eine vollständige Implementierung des ECoreSwitch ansehen , um eine bessere Vorstellung zu erhalten.