2010-01-30 81 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