Показать сообщение отдельно
Старый 23.12.2020, 23:09   #15  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2922 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
гуглить в сторону "ковариантность" и "инвариантность".
Гуглим:

Ковариа́нтность и контравариа́нтность[1] в программировании — способы переноса наследования типов на производные[2] от них типы — контейнеры, обобщённые типы, делегаты и т. п. Термины произошли от аналогичных понятий теории категорий «ковариантный» и «контравариантный функтор».


Цитата:
Сообщение от mazzy Посмотреть сообщение
в java изначально типы ковариантны. и дополнительно было очень много послаблений в примитивных типах.
Это вообще про что? В джаве изначально не было дженериков как и в X++ и в С# какие именно типы были ковариантны?

Цитата:
Сообщение от mazzy Посмотреть сообщение
в аксапте изначально добавили ковариантность в методы классов. что позволяло до ax2009 указывать производные типы методах классов наследников (уж не знаю по недосмотру или был какой замысел).
Это я тоже не понял. При чем тут ковариантность? Имеется ввиду covariant return types?

Вот хочется проверить. У кого под руками есть 2012, можете проверить, что поддерживается именно ковариантность а не произвольное переопределение. Т.е. что контроллируется что метод производного класса обязан возвращать именно подкласс результата переопределенного метода, а не вообще все, что угодно, лишь бы оно было классом (назовем это пофиг-вариантностью)

Цитата:
в ax2012 с какого-то перепуга разработчики сделали типы инвариантными как в C# 2.0. причем очень жестко.
из-за этого нельзя уточнять тип в параметрах методов и в возвращаемых значениях.
Перепуг назывался "компиляция в IL", для того, чтобы статические проверки компилятора гарантировали в большем количестве случаев работу в IL.

X++ изначально это статически типизированный язык натянутый на не очень строго типизированный рантайм.

MyClass x = otherValue;
x.myMethod(a);

Будет работать всегда, когда у otherValue есть метод совпадающий по имени и имеющий один обязательный параметр. Не важно, otherValue наследуется от MyClass или нет.

JFYI, Параметры методов, наоборот, должны быть контровариантными см. LSP.

Цитата:
были слухи, что в ax2012 делали перегрузку методов и генерики.
но ни перегрузки, ни генериков в аксапту так и не завезли.
Перегрузку завезли только со стороны использования (можно вызвать дотнетовский класс и вызов выберет правильную перегрузку). Не знаю в какой версии. В 365 точно есть. Дженерики официально не поддерживаются но какие-то варианты компилируются.

На уровне IL опциональные параметры компилируются в перегрузки.

Цитата:
в d365fo, насколько я помню, типы снова стали ковариантными.
после того, как в C# 4.0+ добавили ковариантность для генериков
Тут мне опять непонятно, что такое "типы ковариантные" если нет дженериков. Ковариантности возвращаемых значений функции нет.

Цитата:
сделано "как в c#" людьми, которые кроме c# ничего не знают.
Это же предположение же, ты ж не знаешь наверняка что знает человек который это делал?

Последний раз редактировалось belugin; 23.12.2020 в 23:21.