Delphi Generic Types - Специфика? - PullRequest
2 голосов
/ 25 мая 2011

Я пытаюсь создать универсальный класс под delphi под названием TRange. Идея состоит в том, что это может быть Range of Integer или диапазон сингла или Double и т. Д.

Объект TRange содержит несколько переменных типа T (maxValue, minValue, idealValue и т. Д.). TRange содержит функцию для каждого из них, чтобы преобразовать их в строку. Однако, поскольку Delphi является языком со строгой типизацией, мне нужно указать «How-To» для преобразования различных переменных в строку.

Я могу получить typeName типа T с помощью GetTypeName (TypeInfo (T)). Узнав, какой тип T, я подумал, что могу сделать что-то вроде:

if(className = 'single') then
 result := formatFloat('0.0', self.AbsMin as Single)
 else
 result := intToStr(self.AbsMin as Integer)

Однако компилятор говорит мне: «Оператор не применим к этому типу операнда».

Итак, я думаю, мой вопрос:

Есть ли способ придать специфичность универсальному классу ???

1 Ответ

6 голосов
/ 25 мая 2011

Ошибка компилятора происходит из-за того, что вы не можете использовать оператор as для приведения к примитивному типу, например Single или Integer.Для этого используйте жесткое приведение: Single(AbsMin).

Есть ли способ придать специфичность родовому классу ???значения в строки?Это отчасти противоречит идее универсального класса, потому что теперь вы вернулись к реализации специального поведения для всех случаев.

Если вам это действительно нужно, вы можете ввести интерфейс

IValueStringConverter <T> = interface
  function ToString(Value : T) : String;
end;

Вы можете просто предоставить преобразователь в конструкторе класса TRange и сохранить его в поле:

constructor TRange <T>.Create(Converter : IValueStringConverter <T>);
begin
FConverter := Converter;
end;

Теперь просто используйте конвертер внутри класса, чтобы выполнить преобразование:

Str := FConverter.ToString(AbsMin);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...