Правильно ли это понимание: перегрузка черт и функций достигла ad ho c полиморфизма, но в другом направлении - PullRequest
0 голосов
/ 03 августа 2020

Я изучаю некоторый полиморфизм.

Вики-страница для адресов ржавчины trait - это метод для достижения ad ho c полиморфизма , а страница для ad ho c полиморфизм говорит, что function overloading является примером ad ho c полиморфизма.

Исходя из моего текущего уровня понимания, функция ad ho c polymorphi c, если предоставляется разные типы параметров будут вызывать разные реализации. Но trait и function overloading кажутся такими разными: trait добавляет ограничения на параметры типа, любой тип реализует trait приемлем, в то время как перегрузка функций для конкретного типа, любые типы, которые не перегружены, неприемлемы.

Могу ли я сказать, что trait и function overloading достигают ad ho c полиморфизма в противоположном направлении? Поскольку trait определяется специализацией, а overloading - обобщением?

PS: В C ++ специализация шаблона также может предоставлять различные реализации на основе переданного параметра типа, это также пример ad ho c полиморфизм?

1 Ответ

2 голосов
/ 03 августа 2020

Реализация трейта включает в себя реализацию поведения, которое зависит от типа c и отдельно от других реализаций («ad ho c»), и которое может быть вызвано с тем же написанием при вызове - site как другие реализации («полиморфи c»). Это в том же направлении, что и перегрузка функций.

В C ++ вы можете предоставить перегрузки для достижения ad ho 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()

С ++ имеет аналогию:

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 полиморфизмом, потому что у них есть одна реализация, которая применяется ко всем типам аргументов, которые реализуют любые предъявляемые к ним требования. достичь тех же целей. Специальный полиморфизм c в C ++ обычно достигается с помощью перегрузки функций. Этого также можно достичь с помощью специализации шаблона.

...