2015-10-09 3 views

ответ

3

Как вы видели, общие методы не могут быть виртуальными. Этот тип

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; 

Итак, это ваши варианты. Что касается того, как решить вашу проблему, это сильно зависит от проблемы.

+0

Я ищу решение «общего пути» вопроса (http://stackoverflow.com/questions/32988147/is-it-possible-to-move-the-descendant-of-generic-classtoto -implementation-section? rq = 1) также я пытаюсь исследовать идею AlexS «использовать класс с этой парой методов класса». В реализации эти методы должны делегировать работу на соответствующие выделенные классы ранее и динамически регистрироваться для работы с конкретными данными типы». – user2448862

+0

Я все еще не понимаю, в чем проблема, поэтому не уверенно предлагать решение. Я предложил перегруженные методы в вашем другом вопросе, но даже тогда я не думаю, что знаю достаточно, чтобы судить, хорошо ли это для вашей проблемы. –

+0

Дэвид, спасибо за вашу помощь и время. Конечно ты прав. Использование перегруженных методов - самый простой и эффективный способ. Но предположим, что существует 10 методов, и предполагается использовать эти методы для 10 разных типов. Разве это не повод искать универсальное решение? – user2448862

 Смежные вопросы

  • Нет связанных вопросов^_^