Пара предложений для более чистого способа делать то, что вы делаете:
Варианты 1: Абстрактный метод
Определите process()
для Superclass
и переопределите его для Instance1
и Instance2
:
abstract class SuperClass
{
public void process(String[] args)
{
System.out.println("Process superclass");
}
}
class Instance1 extends SuperClass
{
@Override
public void process(String[] args)
{
System.out.println("Process Instance 1");
}
}
class Instance2 extends SuperClass
{
@Override
public void process(String[] args)
{
System.out.println("Process Instance 2");
}
}
Вариант 2: Шаблон посетителя
Определите класс, который выполняет обработку, и является InstanceVisitor
public interface InstanceVisitor
{
public void processSuperclass(Superclass obj, String[] args);
public void processInstance1(Instance1 obj, String[] args);
public void processInstance2(Instance2 obj, String[] args);
}
public class InstanceProcessor implements InstanceVisitor
{
public void processSuperclass(Superclass obj, String[] args)
{
System.out.println("Process superclass");
}
public void processInstance1(Instance1 obj, String[] args)
{
System.out.println("Process Instance 1");
}
public void processInstance2(Instance2 obj, String[] args)
{
System.out.println("Process Instance 2");
}
}
Затем каждый подкласс принимает посетителя и вызывает правильный метод:
abstract class SuperClass
{
public void accept(InstanceVisitor v, String[] args)
{
v.visitSuperclass(this, args);
}
}
class Instance1 extends SuperClass
{
@Override
public void accept(InstanceVisitor v, String[] args)
{
v.visitInstance1(this, args);
}
}
class Instance2 extends SuperClass
{
@Override
public void accept(InstanceVisitor v, String[] args)
{
v.visitInstance2(this, args);
}
}