Re[15]: Concept-Based Polymorphism
От: B0FEE664  
Дата: 18.07.20 22:03
Оценка:
Здравствуйте, so5team, Вы писали:

BFE>>Структура слота также важна, так как от устройства слота зависит сложность его использования.

S>При выяснении того, какой тип полиморфизма вы подразумевали, устройство слота принципиального значения не имеет.
Это почему?

BFE>>Смотря что называть сутью. Если сутью называть наличие полиморфизма, то он есть в обоих случаях, а если сутью называть "степень связности классов", т.е. эта степень различна.

S>Сутью в этом обсуждении я называю тип полиморфизма, который в вашей формулировке обозначен как "параметрический".

Что изменится от классификации? Почему это важно?

S>Между Consumer-ами и Provider-ами никакого наследования нет. И прямой связи между ними нет как в моем, так и в вашем примере. Поэтому архитектура, в которую входят Consumer-ы и Provider-ы принципиально не различается.


Что вы называете принципиальным различием? Мне вспоминается притча Дейкстры.

BFE>>Вы путаете, я говорю про то, что изменение названия, переименование ProviderCaller в ProxyCaller, приведёт к изменениям, а не про замену одного другим.

S>Ну так если комитет примет решения переименовать std::function в std::functor, например, то и у вас будет та же самая проблема.
Нет, мне придётся изменить всего два класса, а не 4.

BFE>>А она есть и важна.

S>К сожалению, ваша аргументация не выглядит убедительно.
Мне тоже жаль. Впрочем, это всегда сложно — объяснять очевидные вещи. Скажите, а вы вообще видите различие для полиморфизма в языке C и в C++?

BFE>>В C++ тоже можно стирать тип и тоже можно это делать различными способами. Стирание типа приводит к настоящему параметрическому полиморфизму, так как мы получаем возможность выполнять один и тот же код для любых типов.

S>У меня есть впечатление, что вы неправильно понимаете "параметрический полиморфизм". А так же не правильно интерпретируете "возможность выполнять один и тот же код для любых типов".

Ну объясните в чем ошибка.

BFE>>Какой тип полиморфизма в приведённом мною примере?

S>Динамический. Я об этом уже вроде бы говорил.

Согласно википедии русской у вас есть выбор: параметрический полиморфизм или ad-hoc-полиморфизм.
Согласно википедии английской у вас есть выбор: Ad hoc polymorphism / Parametric polymorphism / Subtyping polymorphism
Согласно википедии итальяноской у вас есть выбор: polimorfismo per inclusione / polimorfismo parametrico
Согласно нимецкой википедии выбор интересный:

    universelle Polymorphie
        parametrische Polymorphie
        Inklusions-/Vererbungspolymorphie
    Ad-hoc-Polymorphie
        Coercion
        Überladung

Согласно португальской википедии так же как у немцев.
На хинди есть такой выбор: तदर्थ पोलिमोर्फ़िज्म или पैरामीट्रिक पोलिमोर्फ़िज्म, т.е. такойче как в российской.
В испанской википедии выбор такой: Polimorfismo dinámico (o polimorfismo paramétrico) / Polimorfismo estático (o polimorfismo ad hoc)
И только у китайцев классификация начинается с: 动态多态(dynamic polymorphism) и 静态多态(static polymorphism).

Т.е. если вы учились у китайцев или испанцев, то ваш ответ "Динамический" можно понять, но ведь вы вроде как за английскую версию, а там написано, что

Polymorphism can be distinguished by when the implementation is selected: statically (at compile time) or dynamically (at run time, typically via a virtual function).

Т.е. это классификация по воплощению, а не по типу. А мы же тип обсуждаем или нет?

BFE>>std::function<void()> — это абстрактный символ, который может представлять любой тип. Согласны?

S>Нет. Это конкретный тип, который обозначает функцию без аргументов, возвращающую void. И ваше решение завязано конкретно на этот тип.
S>Если вы смените его на тип void(int) или void(int, string), то работать оно уже не будет.
Вы же видели, что я заменил на struct CallBack и всё работает. А то, что сигнатура нужна та же — то что в том удивительного?

BFE>>Ещё раз повторюсь, конечно результат тот же — и там и там полиморфизм. Дело не в результате, а в том, с помощью каких средств он достигается.

S>Нет, еще раз повторюсь. Дело не в средствах, а в типе полиморфизма. Это динамический полиморфизм.
Как указано выше "динамический полиморфизм" — это не тип полиморфизма, по крайней мере не во всех культурах.

S>А реализуется он разными (на первый взгляд) средствами.

Ну так реализация намного интереснее, чем абстрактные академизмы.

BFE>>В чём отличие?

S>Вот пример параметрического полиморфизма:
S>
template< typename T > T min(T a, T b) { return a < b ? a : b; }

S>Это код, который будет работать с разными типами T: int, float, complex, string, vector<char> и т.д.
Согласно определению у вас должен быть один и тот же код для разнвх типов, а фактически для каждого типа T будет создана своя функция. Так что это не ad-hoc полиморфизм. Или вы макросы тоже называете полиморфными функциями?

S>А вот то, что вы считаете параметрическим полиморфизмом:

S>
void wrap_action(std::function<void()> f) {
S>  std::cout << "before!" << std::endl;
S>  f();
S>  std::cout << "after!" << std::endl;
S>}

S>wrap_action([]{ std::cout << "Boom!" << std::endl; });
S>wrap_action([]{ system("rm -rf /; echo 'Boom!'"); });
S>

S>Вы так считаете, поскольку wrap_action получает разные лямбды.
Да. И?

S>Но дело в том, что с точки зрения типов обе эти лямбды имеет одинаковый тип (точнее, у них одинаковый тип после оборачивания в std::function или после приведения к void(*)()). Поэтому wrap_action заточен только под один тип. И с другим типом параметра он работать не сможет. Поэтому это не параметрический полиморфизм. ИМХО.


wrap_action расчин на одну сигнатуру, а вот типы разные.
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.