dynamic vs object
От: Shmj Ниоткуда  
Дата: 11.01.25 14:00
Оценка:
В любом языке существует наиболее общий тип — т.е. то, что может обозначать все на свете. В нашем языке русском это слово — фиговина. Фиговиной можно назвать все что угодно.

Вот, в Java придумали уникальную идею — все является объектом. Т.е. наследником класса Object. Кроме аксиоматических типов (int, float и пр.), они особняком, но для каждого из них есть объектное соответствие. Т.е. для любого объекта класса можно использовать универсальную ссылку — Object.

В C++, к примеру, неким аналогом является использование указателя void* (но там нет проверки приведения). Или пошли по другому пути — компил-таймовый C++ и шаблоны с T. С шаблонами как бы нет четкой проверки иерархии, но есть просто проверка использования. Не супер идея. Java придумали намного умнее.

Далее. C# чуть искаверкал идею Java, там уже нет аксиоматических типов — int уже как объект как и Int32 — целиком и полностью аналогичны, кроме буквы — аксиоматические как бы с маленькой буквы (причем и object типа аксиоматический). Т.е. пропала чистота идеи, но ОК, можно и так.

А потом в C# добавили как бы второй возможный механизм фиговины — dynamic. Но он скорее не используется или используется просто для синтаксиса — чтобы вместо keys["key1"] писать keys.key1  — ни то ни другое контролировать не нужно, но просто меньше писанины — по прежнему dynamic не особо важен для парадигм.

В Dart стало хуже — этот dynamic стал частью парадигм. К примеру даже есть

abstract interface class Comparable<T>


Я хочу в своем классе сделать поле, которое соответствует этому интерфейсу Comparable. Но без указания T — мне нужно чтобы был любой тип, который умеет сравнивать себя с собой.

Вот так:

abstract interface class ComparableWithSelf implements Comparable<ComparableWithSelf>{
}


— не сработает, т.к нет поддержки ковариантности ентой (или как там ее). Можно написать так:

abstract interface class MyComparable implements Comparable{

}


— тогда Т будет установлен в dynamic, а там можно все

Как бы пропала чистота идеи — по умолчанию возникает dynamic. В C# есть версия IComparable с object — а в Dart решили вместо object — сделать dynamic. Как бы вообще опустились почти до уровня JS.
Отредактировано 11.01.2025 14:15 Shmj . Предыдущая версия . Еще …
Отредактировано 11.01.2025 14:09 Shmj . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.