2009-11-26 27 views

回答

49

方法重載在編譯時解決。

多次調度在運行時解析。

使用雙分派時,被調用的方法取決於接收方和參數的實際類型。然而,方法重載只允許被調用的方法依賴於聲明的參數類型。爲什麼? Java在編譯時將它們的全部簽名綁定到方法調用(早期綁定)。完整的簽名包括所有的參數類型,因此當參數的實際類型在運行時(polymoprhism)有所不同時,重載不能像你期望的那樣工作!

void add(Foo o) { ... } 
void add(Bar o) { ... } 
void client() { 
    Foo o = new Bar(); 
    add(o); // calls add(Foo) not add(Bar)! 
} 

使用多分派然而

void add(Foo o) { o.dispatch(this); } 
void add(Bar o) { o.dispatch(this); } 
void client() { 
    Foo o = new Bar(); 
    add(o); // calls #dispatch as defined in Bar! 
} 

事情可能在Scala中略有不同,但一般的區別應該是一樣的在這裏所有的編程語言呈現。

+0

感謝您的好例子。 – shj 2013-12-10 21:53:20

相關問題