Здравствуйте, 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 расчин на одну сигнатуру, а вот типы разные.