Здравствуйте, Qbit86, Вы писали:
V>>Так ты, действительно, не понимаешь?
Q>у тебя illusion of transparency.
Да не отмазывайся, ты накосячил в рассуждених пару постов назад, дополнительно усугубив это тем, что не обратил внимание на свой косяк даже после намёка. Неожиданно, прямо скажем.
Ты, вообще, программист или где? Сосредоточься, или не пиши.
V>>Потому что "параметрический полиморфизм" (якобы параметрический полиморфизм) для ref-типов реализован в C# именно таким образом.
V>>Т.е., нет никакого смысла опираться на некий T, потому что доступен только лишь IBarable. И вся "польза" от такого полиморфизма — в исключении проверок/приведений типов в исходнике пользователя.
Q>Во-первых, у пользователя библиотеки интерфейс IBarable может быть реализован value-типом.
Ну вот, ЧТД.
Продолжаем откровенно притормаживать.
1. Было написано (специально):
для ref-типов
2. Большинство алгоритмов даже из базовой библиотеки не работают на value-типах, кроме случаев, когда этот тип является элементом контейнера (или последовательности), т.е. кроме тех случаев, когда НИКАКИХ методов у целевого типа T не вызывается. А у тебя в примерах идёт вызов метода именно у типа Т.
Собсно, вообще таких алгоритмов мало, которые можно выразить в дотнете для value и ref-типов в генериках и они будут корректно работать в обоих случаях. Я одно время на этом собаку съел, в поисках классов таких алгоритмов, которые, таки, работают в обоих случаях и в попытках сформулировать ограничения на такие алгоритмы. А у тебя какой-то детсад прёт, сорри: "а вот бывает... а вот если...".
Q>Во-вторых, в сигнатуре динамически полиморфного метода ты можешь указать только один тип; а в констрейнтах дженерика несколько. Соответственно, пользовательская структура тоже реализует несколько интерфейсов, но без единой иерархии с одним «общим» интерфейсом.
И опять рука-лицо.
Потому что для случая дотнета это как раз абсолютно однофигственно — ты можешь ввести тот самый исскуствепнный "общий" интерфейс и выразить ограничения через него. И абсолютно ничего ни в одном месте, где будет или использована такая структура (или уже была исопльзована), не поломается и не изменится. Ни-че-го.
Q>Покажи, как на C++ будет выглядеть этот более общий вариант.
Опять и снова рука-лицо.
template<typename T>
void Foo(T * t)
{
IQuxable * q = t;
IBarable * b = t;
q->Qux();
b->Bar();
}
Я же, блин, расписывал для особо одарённых:
Т.е., нет никакого смысла опираться на некий T, потому что доступен только лишь IBarable. И вся "польза" от такого полиморфизма — в исключении проверок/приведений типов в исходнике пользователя.
Т.е., С++ вариант отличается от варианта C# именно
приведением типов в исходнике пользователя. Если такое приведение типов невозможно, компиляция не состоится, ву-а-ля. И Решарпер прекрасно всё подскажет даже внутри шаблона, кста.
===========
Предлагаю завязывать, бо мне уже трудно сдерживать откровенное глумление...
Столько было пафоса и такой пффф... Не могу отучить себя реагировать на такую комбинацию ))