я пытаюсь использовать полиморфизм, чтобы включить другую обработку объекта на основе его класса, а именно:Обеспечение динамических полиморфных вызовов с входными аргументами общего родительского типа
public class GeneralStuff {
private int ID;
}
public class IntStuff extends GeneralStuff {
private int value;
public void setValue(int v)
{
value = v;
}
public int getValue()
{
return value;
}
}
public class DoubleStuff extends GeneralStuff {
private double value;
public void setValue(double v)
{
value = v;
}
public double getValue()
{
return value;
}
}
public class ProcessStuff {
public String process(GeneralStuff gS)
{
return doProcess(gS);
}
private String doProcess(IntStuff i)
{
return String.format("%d", i.getValue());
}
private String doProcess(DoubleStuff d)
{
return String.format("%f", d.getValue());
}
}
public class Test {
public static void main(String[] args)
{
IntStuff iS = new IntStuff();
DoubleStuff dS = new DoubleStuff();
ProcessStuff pS = new ProcessStuff();
iS.setValue(5);
dS.setValue(23.2);
System.out.println(pS.process(iS));
System.out.println(pS.process(dS));
}
}
Это, однако, не работает, потому что вызов doProcess(gS)
ожидает метод с подписями doProcess(GeneralStuff gS)
.
Я знаю, что в классе я мог бы иметь два открытых полиморфных метода процесса, но реальная ситуация не позволит этого, потому что я работаю в рамках ограничений существующего библиотечного механизма; это просто надуманный пример тестирования.
Я мог бы, конечно, определить process(GeneralStuff gS)
, как
public String process(GeneralStuff gS)
{
if (gS instanceof IntStuff)
{
return doProcess((IntStuff) gS);
}
else if (gS instanceof DoubleStuff)
{
return doProcess((DoubleStuff) gS);
}
return "";
}
, который работает, но мне кажется, что я не должен делать это (плюс, программирование полиции будет насаживать меня за использование InstanceOf таким образом,).
Есть ли способ, которым я могу лучше применять полиморфные вызовы?
Заранее благодарим за любую помощь.
В реальном приложении объекты параметров ('IntStuff',' DoubleStuff') упаковываются как экземпляры 'GeneralStuff' в объект' Bundle', который передается другому ('ProcessStuff') для обработки, где объекты параметров вытягиваются и выполняются разные действия по их фактическим типам. Таким образом, на самом деле у меня нет возможности предоставлять перегруженные методы процесса в 'ProcessStuff', которые вызываются напрямую (предложенный @ βнɛƨн Ǥʋяʋиɢ), и перемещение метода' process' в 'GeneralStuff', вероятно, также не является вариантом (предложенный вами и @codegrabber). –