2012-06-05 12 views
6

Estoy intentando escribir una propiedad que utiliza los genéricos:establecimiento a través de los genéricos en Delphi

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

pero el compilador falla en la declaración de propiedad con el mensaje 'Propiedad CountBy no existe en la clase base', y el garabato rojo en la apertura < del nombre de la propiedad.

¿Hay alguna manera de lograr esto?

Editar: Aquí es mi otro caso de uso, lo que es más complejo, pero el mundo más real:

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

La función filtra el contenido de una lista para devolver el artículo Index'th de la clase especificada.

+0

Simplemente necesita TDictionary aquí. Los genéricos no son apropiados para este problema. –

+0

-1. Esta sería una mejor pregunta si estuviera motivada por un problema que realmente se beneficiaría de los genéricos. El ejemplo "propiedad genérica" ​​en la pregunta no necesita genéricos en absoluto. Esto tiene el potencial de ser una buena pregunta acerca de la sintaxis correcta para las propiedades genéricas (si tal sintaxis existe), pero el problema de ejemplo a ser resuelto por tal sintaxis realmente no demuestra la necesidad. –

Respuesta

9

propiedades genéricas no son compatibles con Delphi. Solo clases genéricas o métodos genéricos.

No puedo encontrar nada en la documentación que explícitamente establece esa limitación. Por otro lado, la documentación solo describe clases genéricas y métodos genéricos. Y el new language grammar to support generics tampoco hace mención de las propiedades.

+1

Eso es correcto. –

1

no estoy al tanto de los genéricos, pero no debería ser la declaración de la misma familia

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

@Lieveb, la clase contiene una lista de objetos. Quiero que una propiedad devuelva un recuento de los objetos de una clase determinada, por lo que no es necesario clasificarse como 'genericalizados', solo la propiedad Countby. (Puedo hacer esto con una función, pero prefiero implementarlo como una propiedad). –

+6

@MikeSutton - ¿Por qué usaría genéricos para eso? ¿No puedes declarar tu propiedad como 'propiedad CountBy [AClass: TClass]: Integer read GetCountBy;' –

+1

@Lieven: no, no necesariamente. Una clase normal puede tener métodos genéricos. Pero no creo que las propiedades genéricas estén permitidas de esta manera. La única solución es hacer que la clase sea genérica y la propiedad NO genérica. –

Cuestiones relacionadas