我正在学习一些多态性。
rust addresses trait
的维基页面是一个method to achieve ad hoc polymorphism,ad hoc polymorphism的页面说function overloading
是一个特别多态性的例子。
根据我目前的理解,如果提供不同类型的参数将调用不同的实现,则函数是即席多态的。但是trait
和function overloading
似乎如此不同:trait
在类型参数上添加约束,任何类型实现trait
都是可以接受的,而在具体类型上函数重载重载,任何没有重载的类型都是不可接受的。
我可以说trait
和function overloading
实现了相反方向的即席多态性吗?因为trait
是通过专门化,而overloading
是通过泛化?
PS:在c++中,模板专门化也可以根据传入的类型参数提供不同的实现,这也是ad hoc多态性的一个例子吗?
发布于 2020-08-03 08:23:58
实现特征涉及提供行为的实现,该实现是特定于类型的并且与其他实现分离("ad hoc"),并且可以在调用点使用与其他实现相同的拼写来调用(“多态”)。它和函数重载的方向是一样的。
在C++中,您可以提供重载来实现即席多态性:
void foo(const X&) { ... }
void foo(const Y&) { ... }
// can call foo(z) where z is an X or a Y
你也可以对Rust中的特征做同样的事情:
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中,这看起来像:
fn bar<T: Foo>(t: T) { ... }
// bar can use t.foo()
C++有一个类比:
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++中的即席多态性通常是通过函数重载实现的。模板专门化也可以做到这一点。
https://stackoverflow.com/questions/63221632
复制相似问题