Я бы выбрал другой подход.Либо
- используйте полиморфизм, предложенный другими, расширьте Element, чтобы добавить метод print () (который может быть перезаписан подклассами), либо
- определите интерфейс помощника и используйте комбинациюстратегии и фабричного образца:
Базовый класс
public class Element{}
Производный класс
public class SubElement extends Element{}
Помощник Интерфейс для печати элементов
public interface PrintHelper{
void print(Element element);
}
Фабрика, чтобы получить лучший PrintHelper для данного элемента
public class PrintHelperFactory{
private final Map<Class<? extends Element>, PrintHelper> registeredHelpers =
new HashMap<Class<? extends Element>, PrintHelper>();
// Register a PrintHelper for a given Element class.
public void registerHelper(final Class<? extends Element> clazz,
final PrintHelper helper){
this.registeredHelpers.put(clazz, helper);
}
// Get the most specific PrintHelper for a given Element.
public PrintHelper getHelperForElement(final Element element){
Class<? extends Element> clazz = element.getClass();
while(!Object.class.equals(clazz)){
if(this.registeredHelpers.containsKey(clazz)){
return this.registeredHelpers.get(clazz);
}
clazz = (Class<? extends Element>) clazz.getSuperclass();
}
return null;
}
}
Тестовый класс клиента, запустить как Java-приложение
public class Main{
public static void main(final String[] args){
final PrintHelperFactory factory = new PrintHelperFactory();
factory.registerHelper(Element.class, new PrintHelper(){
@Override
public void print(final Element element){
System.out.println("Element");
}
});
factory.registerHelper(SubElement.class, new PrintHelper(){
@Override
public void print(final Element element){
System.out.println("Sub Element");
}
});
// test it with an Element
final Element elem = new Element();
factory.getHelperForElement(elem).print(elem);
// test it with a sub class
final Element sub = new SubElement();
factory.getHelperForElement(sub).print(sub);
}
}
Вывод
Element
Sub Element