Как вы видели, общие методы не могут быть виртуальными. Этот тип
type
TFoo = class
function Bar<T>: T; virtual;
end;
отвергается с компилятором со следующей ошибкой:
E2533 Virtual, dynamic and message methods cannot have type parameters
Ваш класс объявлен как это:
type
TFoo = class
function GetValue<T>: T;
procedure SetValue<T>(AValue: T);
end;
и вы спрашиваете, как дочерний класс может использовать эти методы. Например, вы можете сделать это:
type
TChildFoo = class(TFoo)
procedure DoSomething<T>;
end;
....
procedure TChildFoo.DoSomething<T>;
begin
SetValue(GetValue<T>);
end;
Другими словами, вы можете использовать эти методы в родительском классе. Вы просто не можете объявить их виртуальными и переопределить их.
Если у вас есть параметризованный класс (а не параметризованный метод), вы можете объявить виртуальные методы и переопределить их.
type
TFoo<T> = class
function Bar: T; virtual;
end;
TChildFoo<T> = class(TFoo<T>)
function Bar: T; override;
end;
Итак, это ваши варианты. Что касается того, как решить вашу проблему, это сильно зависит от проблемы.
Я ищу решение «общего пути» вопроса (http://stackoverflow.com/questions/32988147/is-it-possible-to-move-the-descendant-of-generic-classtoto -implementation-section? rq = 1) также я пытаюсь исследовать идею AlexS «использовать класс с этой парой методов класса». В реализации эти методы должны делегировать работу на соответствующие выделенные классы ранее и динамически регистрироваться для работы с конкретными данными типы». – user2448862
Я все еще не понимаю, в чем проблема, поэтому не уверенно предлагать решение. Я предложил перегруженные методы в вашем другом вопросе, но даже тогда я не думаю, что знаю достаточно, чтобы судить, хорошо ли это для вашей проблемы. –
Дэвид, спасибо за вашу помощь и время. Конечно ты прав. Использование перегруженных методов - самый простой и эффективный способ. Но предположим, что существует 10 методов, и предполагается использовать эти методы для 10 разных типов. Разве это не повод искать универсальное решение? – user2448862