Delphi: определить фактический тип дженерика?

Для меня понятие алгебраических типов данных Haskell всегда было похоже на полиморфизм на языках OO как C#.

Взгляд на пример от http://en.wikipedia.org/wiki/Algebraic_data_types :

data Tree = Empty 
          | Leaf Int 
          | Node Tree Tree

Это могло быть реализовано в C# как базовый класс TreeNode с полученным Листовым классом и полученным классом TreeNodeWithChildren, и если Вы хотите даже полученный класс EmptyNode.

(хорошо я знаю, никто никогда не делал бы это, но по крайней мере Вы могли сделать это.)

6
задан conciliator 18 November 2009 в 13:23
поделиться

2 ответа

Невозможность использования оператора is - известная проблема, но есть довольно простая обходной путь.

  if TObject(Element) is TInt then
    List.AddElement(TInt.Create(XXX))

Кроме того, поскольку тип универсального кода является частью класса и известен во время компиляции, вам может быть лучше реструктурировать свой код. Создайте два разных универсальных класса, один из которых принимает TInt в качестве параметра , а другой принимает TString. Поместите в них специфические для типа функциональные возможности на этом уровне и сделайте так, чтобы они происходили от общего предка для общих функциональных возможностей.

5
ответ дан 10 December 2019 в 02:49
поделиться

Этот вопрос, который я задал некоторое время назад

Условное поведение на основе конкретного типа для универсального класса

может представлять интерес, особенно если вы хотите использовать не только TObject потомков, но также и примитивные типы в ваших условных выражениях.

4
ответ дан 10 December 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: