檢查下面的代碼示例:方法重載和多態 - 什麼是更乾淨的方式來做到這一點?
public class Test
{
private void process(Instance1 obj)
{
System.out.println("Process Instance 1");
}
private void process(Instance2 obj)
{
System.out.println("Process Instance 2");
}
/*
COMMENT THIS OUT - I DON'T HAVE THIS CODE IN REAL LIST. Only here to prove point 3 below calls this
private void process(SuperClass obj)
{
System.out.println("Process superclass");
}
*/
/**
* @param args
*/
public static void main(String[] args)
{
Test test = new Test();
Instance1 instance1 = test.new Instance1();
Instance2 instance2 = test.new Instance2();
SuperClass instance3 = test.new Instance1();
// test #1
test.process(instance1);
// test #2
test.process(instance2);
// test #3 (compiler error unless there is a process(SuperClass obj) call)
test.process(instance3);
// test #4
if(instance3 instanceof Instance1)
test.process((Instance1)instance3);
else if(instance3 instanceof Instance2)
test.process((Instance2)instance3);
}
abstract class SuperClass
{
}
class Instance1 extends SuperClass
{
}
class Instance2 extends SuperClass
{
}
}
這使輸出:
Process Instance 1
Process Instance 2
Process superclass
Process Instance 1
我希望測試#3會知道調用合適的功能,但它似乎沒有。我想這是編譯時的事情,而不是運行時的事情。選項#4有效,但很醜,我希望有更好的方法。
更新:澄清問題...我有一個抽象類,其中存在兩個具體實現。我想要的是在另一個類中有兩個重載方法(每個具體類都有一個),並且能夠在不做任何醜事的情況下調用它。從我現在知道的情況來看,這是不可能的,因爲這是一個編譯時問題,編譯器顯然不知道它是什麼具體類時,它不是強類型。
搜索「雙重分派」。 – Artefacto