Рамка моделювання Eclipse має цікаву ідею, яка також враховує спадщину. Основна концепція визначена в інтерфейсі Switch : перемикання здійснюється шляхом виклику методу doSwitch .
Що насправді цікаво - це реалізація. Для кожного типу відсотків:
public T caseXXXX(XXXX object);
метод повинен бути реалізований (з типовою реалізацією, що повертає нуль). Реалізація doSwitch спробує викликати всі об'єкти caseXXX на об'єкт для всієї його ієрархії типів. Щось у рядках:
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;
Фактичний фреймворк використовує цілий ідентифікатор для кожного класу, тому логіка насправді є чистим перемикачем:
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:
{
...
}
...
Ви можете ознайомитись з повною реалізацією ECoreSwitch, щоб отримати кращу ідею.