2012-06-05 22 views
6

Próbuję napisać właściwość, który używa rodzajowych:personelowi rodzajowych w Delphi

type TMyClass = class 
    protected 
    function GetCountBy<T: Class>: Integer; 
    public 
    property CountBy<T: Class>: Integer read GetCountBy<T>; 
    end; 

ale nie kompilacji w deklaracji majątkowych z komunikatem „Property CountBy nie istnieje w klasie bazowej” i czerwone zawijas na otwarciu < nazwy właściwości.

Czy jest jakiś sposób, aby to osiągnąć?

Edit: Oto mój drugi przypadek użycia, który jest bardziej skomplikowane, ale bardziej realny świat:

property ItemsBy<T: Class>[Index: Integer]: T read GetItemsBy<T> write SetItemsBy<T>; 

Funkcja filtruje zawartość listy, aby zwrócić przedmiot Index'th z określonej klasy.

+0

Po prostu potrzebujesz TDictionary tutaj. Generics nie są odpowiednie dla tego problemu. –

+0

-1. Byłoby to lepsze pytanie, gdyby był motywowany przez problem, który faktycznie skorzystałby z leków generycznych. Przykład "właściwości ogólnej" w pytaniu wcale nie potrzebuje generycznych. Może to być dobre pytanie dotyczące właściwej składni właściwości ogólnych (jeśli taka składnia istnieje), ale przykładowy problem, który można rozwiązać za pomocą takiej składni, tak naprawdę nie pokazuje potrzeby. –

Odpowiedz

9

właściwości generyczne nie są obsługiwane w Delphi. Tylko ogólne klasy lub ogólne metody.

Nie mogę znaleźć niczego w dokumentacji, która wyraźnie określa to ograniczenie. Z drugiej strony w dokumentacji opisano jedynie ogólne klasy i ogólne metody. I new language grammar to support generics również nie wspomina o właściwościach.

+1

To prawda. –

1

nie jestem do prędkości na rodzajowych, ale nie powinna być deklaracja bardziej jak to

type TMyClass<T: class> = class 
    protected 
    function GetCountBy<T>: Integer; 
    public 
    property CountBy<T>: Integer read GetCountBy<T>; 
    end; 
+0

@ Lieveb, klasa zawiera listę obiektów. Chcę, aby właściwość zwróciła liczbę obiektów danej klasy, więc nie muszę klasyfikować się na "uogólniony", tylko na właściwość Countby. (Mogę to zrobić z funkcją, ale wolałbym ją wdrożyć jako własność). –

+6

@MikeSutton - Dlaczego w ogóle używasz do tego generycznych? Nie możesz po prostu zadeklarować swojej własności jako 'property CountBy [AClass: TClass]: Integer read GetCountBy;' –

+1

@Lieven: no, niekoniecznie. Normalna klasa może mieć ogólne metody. Ale nie sądzę, że ogólne właściwości są dozwolone w ten sposób. Jedynym rozwiązaniem jest sprawienie, aby klasa była generyczna, a własność NIE jest generyczna. –