El Marco de modelado de Eclipse tiene una idea interesante que también considera la herencia. El concepto básico se define en la interfaz Switch : el cambio se realiza invocando el método doSwitch .
Lo que es realmente interesante es la implementación. Para cada tipo de interés, un
public T caseXXXX(XXXX object);
El método debe implementarse (con una implementación predeterminada que devuelve nulo). La implementación de doSwitch intentará llamar a todos los métodos caseXXX en el objeto para toda su jerarquía de tipos. Algo en las líneas de:
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;
El marco real utiliza una identificación entera para cada clase, por lo que la lógica es en realidad un interruptor puro:
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:
{
...
}
...
Puede ver una implementación completa de ECoreSwitch para tener una mejor idea.