2010-01-30 80 views
10

好的 - 這可能是一個非常愚蠢的問題,但它一直困擾着我。功能參數多態性

是否有語言,其中

class Animal; 
class Ape : public Animal 
{...} 

void doStuff(Animal* animalPtr) 
{ 
    cout << "doing animal stuff" << endl; 
} 

void doStuff(Ape* apePtr) 
{ 
    cout << "doing ape stuff" << endl; 
} 

Animal *ape = new Ape(); 
doStuff(ape); 

會產生"doing ape stuff"? (請使用C++語法與我聯繫) 爲了澄清,我希望「一個接受參數並根據參數類型對其進行操作的函數」。

它會有道理嗎?當然,作爲一名開發人員,您需要注意,因爲看起來像動物指針的實例可能實際上調用了Ape代碼,因爲在運行時它是一個指向的Ape實例。

回答

7

是的,有!這叫做multiple dispatch。維基百科的文章非常好。令人遺憾的是,它似乎只能通過大多數流行語言的語言擴展來支持,但有一些(通常是深奧的)語言在本地支持它。

+0

常見LISP ...爲什麼這是一個驚喜(不!);) 謝謝你的術語澄清和維基百科鏈接! – msi 2010-01-30 21:30:20

+0

我會第二個共同的lisp。 – Demosthenex 2010-01-30 23:59:03

+0

把它分類爲深奧的幾乎令人傷心:-p – 2010-01-31 03:01:29

1

可能是這樣,但它不會是C++,因爲C++中的函數重載查找是在編譯時完成的,而不是像這裏所要求的那樣運行。這將需要一種動態語言,允許類型提示和重載。

+0

嗯,我知道,C++不支持該功能,我是「八九不離十」尋找。當用C++進行編碼時想到了我。 這是什麼使動態/靜態語言之間的區別? – msi 2010-01-30 21:23:29

+0

是的。動態語言在運行時進行類型檢查/屬性查找,而不是編譯時。它減慢了他們的操作,但允許更大的靈活性。 – 2010-01-30 21:27:08

+0

不,不可以 - 你可以有一個非常動態的語言(比如說Python),它不支持開箱即用......你必須使用一個特殊的「multimethods」插件。 – 2010-01-30 21:29:21

1

這裏有一些不一致,令人困惑。你是否想要一個接受參數並根據參數類型對其進行操作的函數?這並不是真正的多態,因爲函數處於孤獨的狀態,它們不屬於類或接口層次結構的方法。換句話說,就像混合OO範式和程序範式一樣。

如果是想要參數化的類型而不是變量,那麼您可以使用類似Java泛型的東西。對於泛型,您可以通知一種方法,即進入的參數的類型也是可變的。該方法以通用方式作用於變量類型。

+0

我正在尋找的功能的很好的描述 - 我非常大膽地把它放在我的問題的編輯。你是對的 - 多態現象可能是一個不好的名詞,但是沒有其他人想到我。 – msi 2010-01-30 21:28:42

1

Open Multi-Methods for C++,Peter Pirkelbauer,Yuriy Solodkyy和Bjarne Stroustrup。

本文討論了將多種方法集成到C++中的語言擴展以及一些非常有趣的實現細節,如處理動態加載的庫和正確調度的實際佈局。請注意,它尚未成爲C++標準的一部分,可能不是任何主要編譯器的一部分。

7

看看在Visitor pattern

+0

對於不支持多次調度和/或模式匹配的語言來說,訪問者模式可能是最好的解決方案。 – Evan 2010-01-30 22:18:48