2009-09-15 7 views
3

У меня есть структура persistence, и я пытаюсь использовать generics, поэтому мне не нужно создавать новые классы классов для каждого типа объектов, которые я хочу хранить безопасным типом. .Ссылка на класс из класса общих параметров

У меня есть метод, который возвращает класс, содержащийся объект в классе списка (так что я знаю, какие запросы запускать и которые возражают против создания

В качестве примера, это выглядит примерно так:

type 

    TMyObject = class 

    end; 
    TMyObjectClass = class of TMyObject; 


    TMyObjectList = class 
    public 
    function ListClass: TMyObjectClass; virtual; abstract; 

    end; 

    TMyObjectList<T: TMyObject, constructor> = class(TMyObjectList) 
    public 
    function ListClass: TMyObjectClass; override; 

    end; 

implementation 

{ TMyObjectList<T> } 

function TMyObjectList<T>.ListClass: TMyObjectClass; 
begin 
    result := T; // <==== this wont compile 
end; 

end. 

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

Благодаря

N @ (с использованием Delphi 2009)

ответ

6

Это a known issue in Delphi 2009. Это было зафиксировано в 2010 году я только проверил это и ваш код компилируется нормально там.

+0

Вы. Находятся. Легенда. Благодаря! Не могу дождаться выхода 2010 года (должно быть, завтра, yay!). – Nat

+0

Прохладный! Улучшенный RTTI сделает настойчивость намного проще, BTW. :) –

0

T не является экземпляром объекта.

В вашем конкретном примере, вы должны написать что-то вроде:

результат: = Я;

Я думаю, что вы ищете неправильный путь ...

+0

Я хотел бы вернуть ссылку на * класс *, а не ссылку на экземпляр объекта. – Nat

+0

Нет, 'T' не является экземпляром объекта. 'T' - класс. Вы сбиты с толку, потому что ограничение ** ** «T: TMyObject» выглядит как объявление переменной, где 'T' будет ссылкой' TMyObject'. Generics означает, что классы теперь как * type parameters * так же, как функции имеют * значения параметров *. –

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