首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这种理解正确吗:特征和函数重载都实现了即席多态,但方向不同

这种理解正确吗:特征和函数重载都实现了即席多态,但方向不同
EN

Stack Overflow用户
提问于 2020-08-03 06:30:53
回答 1查看 193关注 0票数 0

我正在学习一些多态性。

rust addresses trait的维基页面是一个method to achieve ad hoc polymorphismad hoc polymorphism的页面说function overloading是一个特别多态性的例子。

根据我目前的理解,如果提供不同类型的参数将调用不同的实现,则函数是即席多态的。但是traitfunction overloading似乎如此不同:trait在类型参数上添加约束,任何类型实现trait都是可以接受的,而在具体类型上函数重载重载,任何没有重载的类型都是不可接受的。

我可以说traitfunction overloading实现了相反方向的即席多态性吗?因为trait是通过专门化,而overloading是通过泛化?

PS:在c++中,模板专门化也可以根据传入的类型参数提供不同的实现,这也是ad hoc多态性的一个例子吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-03 08:23:58

实现特征涉及提供行为的实现,该实现是特定于类型的并且与其他实现分离("ad hoc"),并且可以在调用点使用与其他实现相同的拼写来调用(“多态”)。它和函数重载的方向是一样的。

在C++中,您可以提供重载来实现即席多态性:

代码语言:javascript
运行
复制
void foo(const X&) { ... }
void foo(const Y&) { ... }
// can call foo(z) where z is an X or a Y

你也可以对Rust中的特征做同样的事情:

代码语言:javascript
运行
复制
trait Foo { fn foo(); }
impl Foo for X { ... }
impl Foo for Y { ... }
// can call z.foo() where z is an X or a Y

我认为你所指的“另一个方向”是能够通过类型支持的行为来约束泛型。在Rust中,这看起来像:

代码语言:javascript
运行
复制
fn bar<T: Foo>(t: T) { ... }
// bar can use t.foo()

C++有一个类比:

代码语言:javascript
运行
复制
template<typename T> concept Foo = requires(T t) { foo(t); };
void bar(Foo auto& t) { ... }
// bar can use foo(t)
// (this uses really new C++, it's written differently in older C++)

受约束的泛型函数不是即席多态,因为它们有一个实现,该实现适用于实现对它们的任何要求的所有参数类型。

总之,特征提供了特殊的多态性和对泛型函数的约束,一些语言,如C++,使用不同的设备来实现相同的目的。C++中的即席多态性通常是通过函数重载实现的。模板专门化也可以做到这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63221632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档