Delphi 2010 - Почему я не могу объявить абстрактный метод с параметром универсального типа? - PullRequest
3 голосов
/ 23 марта 2010

Я пытаюсь сделать следующее в Delphi 2010:

TDataConverter = class abstract
public
    function Convert<T>(const AData: T): string; virtual; abstract;
end;

Однако я продолжаю получать следующую ошибку компилятора:

E2533 Virtual, dynamic and message methods cannot have type parameters

Я не совсем понимаю причину, почему я не могу этого сделать. Я могу сделать это в C # например

public abstract class DataConverter
{
    public abstract string Convert<T>(T data);
}

Кто-нибудь знает причину этого?

1 Ответ

7 голосов
/ 23 марта 2010

Вы можете сделать это в .NET, потому что Delphi и .NET по-разному обрабатывают дженерики. Я не знаю достаточно, чтобы вдаваться в подробности. Я знаю, почему вы не можете сделать это в Delphi.

Каждый виртуальный метод должен иметь слот в таблице виртуальных методов для класса. Это необходимо настроить при компиляции устройства, чтобы его информация могла быть помещена в DCU. (И аналогично, каждый динамический метод должен иметь запись в таблице динамических методов во время компиляции модуля.)

Но если вы создаете общие методы, каждый раз, когда вы вызываете их в коде, создается другая копия кода, специфичная для этого параметра типа. Это необходимо для обработки разных типов по-разному. (Если вы, например, передаете интерфейс или строку, он должен позаботиться о количестве ссылок.) Но вы не можете создавать новые виртуальные методы и новые слоты VMT для них, поскольку DCU уже создан и не может быть изменено сейчас .

...