Delphi: общие и типовые ограничения - PullRequest
1 голос
/ 12 ноября 2009

Можно ли ограничить тип общего, скажем, двумя различными классами?

Вроде так:

TSomeClass<T: FirstClass; T: SecondClass> = class
  // ...
end;

(Извините за отсутствие форматирования - панель инструментов SO исчезла из моего браузера). Я знаю, что вышеизложенное не скомпилируется, написано только для того, чтобы дать вам, ребята, идею Я пытался

TSomeClass<T: FirstClass, SecondClass> = class
  // ...
end;

но тогда мне не разрешили написать

procedure TSomeClass.SomeMethod<T> (Param1: string);

Это вообще возможно?

Ответы [ 2 ]

10 голосов
/ 12 ноября 2009

Нет, это невозможно. Как компилятор должен быть в состоянии статически проверить, что ваши вызовы методов действительны?

Обратите внимание, что

TSomeClass <T : FirstClass, SecondClass>

не является допустимым ограничением типа. Вы не можете объединить несколько ограничений класса. Вы можете объединить ограничение класса с некоторыми интерфейсными ограничениями. Но даже тогда

TSomeClass <T : TSomeClass, ISomeInterface>

означает, что универсальный тип должен происходить от TSomeClass и внедрение ISomeInterface.

Таким образом, единственное, что вы можете сделать, это извлечь материал, общий для FirstClass и SecondClass, поместить его в интерфейс и использовать ограничение интерфейса:

TSomeClass <T : IOnePointFive>

Возможно, вы сможете рассказать подробнее о том, чего хотите достичь.

2 голосов
/ 12 ноября 2009

Использование обоих классов для реализации одного и того же интерфейса - путь. Затем ограничьте общий интерфейс для этого интерфейса.

...