PDA

Ver la Versión Completa : ¿Mejor heredar de una Lista o mejor introducir la Lista en un campo?


Jome
21-11-2005, 12:21:01
Hola.

Antes que nada quiero saludar a todos puesto que es mi primer post, así como agradecer de antemano vuestra ayuda.

Vamos al asunto.
Se trata de una simple clase que va a contener una lista de objetos. Para ello me voy a apoyar en la clase TStringList (va a poseer Valores y Objetos asociados).

¿Qué creéis que es más correcto (o elegante)?


TMiLista = class
protected
FObjetos: TStringList;
public
constructor Create;
destructor Destroy; override;
function AddObjeto(const Abbrev: string; Objeto: TMiObjeto): Integer;
function GetObjeto(Abbrev: string): TMiObjeto;
end;


TMiLista = class(TStringList)
private
function GetObject(ObjIndex: Integer): TMiObjeto;
procedure SetObject(ObjIndex: Integer; const Value: TMiObjeto);
public
destructor Destroy; override;
function GetObjeto(Abbrev: string): TMiObjeto;
property Objects[ObjIndex: Integer]: TMiObjeto read GetObject
write SetObject;
end;


Hay que tener en cuenta que, si posible, no quiero dar acceso a la propiedad Objects, es decir, no dar acceso a los objetos de la lista directamente, sino hacerlo sólo a través de los métodos (establecer como una "caja negra").
Por ello, mi preferencia es la primera clase, pero si me decís que no es elegante, o no se suele hacer, pues utilizaré la segunda clase.

Muchas gracias.
Un saludo.

EDITO para modificar modificar y aclarar un poco el título.

delphi.com.ar
21-11-2005, 13:00:35
...no quiero dar acceso a la propiedad Objects, es decir, no dar acceso a los objetos de la lista directamente, sino hacerlo sólo a través de los métodos (establecer como una "caja negra")...
Con algo tan excluyente como eso, la primera opción es la única posible.

Si quieres utilizar las ventajas del polimorfismo, y quieres que tu clase pueda ser utilizada por ejemplo por los controles de la VCL, la segunda opción es la apropiada.

Saludos!

Jome
22-11-2005, 10:51:36
Si quieres utilizar las ventajas del polimorfismo, y quieres que tu clase pueda ser utilizada por ejemplo por los controles de la VCL, la segunda opción es la apropiada.

Bien, pues utilizaré la segunda opción ya que, por lo que dices, aporta más flexibilidad aunque, en principio, simplemente se tratará de una simple lista de objetos sin más.

¡Muchas gracias!

Lepe
22-11-2005, 11:53:20
¿No te sería más comodo derivar de TObjectList?, que maneja una lista de objetos por sí mismo.

El string lo meterías dentro del objeto, y listo.

Solo tendrías que hacer un par de forzados de tipos para tener una lista de objetos que te devuelvan el TMiObjeto en lugar del típico TObject.

saludos

Jome
22-11-2005, 20:25:36
¿No te sería más comodo derivar de TObjectList?, que maneja una lista de objetos por sí mismo.

El string lo meterías dentro del objeto, y listo.

Solo tendrías que hacer un par de forzados de tipos para tener una lista de objetos que te devuelvan el TMiObjeto en lugar del típico TObject.

saludos
La decisión de usar TStringList ha sido porque necesito poder buscar entre los objetos mediante el campo Abbrev. Entonces, me he apoyado en la clase TStringList porque posee el método Find (si está ordenado) ó IndexOf (si no está ordenado) y así no tengo que implementarlo yo.
Es cierto que con un TStringList desperdicio algo de memoria,ya que el campo Abbrev lo contiene por duplicado: una vez como Value y otra dentro del propio MiObjeto.

La clase TObjectList también posee el método IndexOf pero, salvo que me corrijáis, creo que no lo puedo aprovechar para buscar entre los objetos según un determinado campo (corregidme si me equivoco porque de esto no estoy seguro).

Es cierto que mediante la clase TObjectList me puedo evitar tener que destruir cada uno de los objetos, pero dentro del uso que le voy a dar a esta lista no se encuentra el de poder borrar algún objeto, simplemente va a ser una lista fija que contendrá objetos provenientes de un archivo XML, y a la que accederé de vez en cuando (se puede decir que una vez cargada, será de sólo lectura).

Precisamente por ser de sólo lectura, en lugar de heredar de TStringList había pensado en encapsular el TStringList, y publicar (wrappear -ó como se diga- ) sólo el método Find (ó IndexOf) ya que es el único que voy a emplear. Pero bueno, el usuario delphi.com.ar me ha dado a entender que heredar me aportaría más flexibilidad (y quizás más adelante me dé cuenta de que la necesito) y me ha convencido.

Lepe
23-11-2005, 17:28:17
La clase TObjectList también posee el método IndexOf pero, salvo que me corrijáis, creo que no lo puedo aprovechar para buscar entre los objetos según un determinado campo (corregidme si me equivoco porque de esto no estoy seguro).


No te equivocas, indexOf le tienes que pasar un TObject y te dice si está o no.

Implementarlo es bastante fácil, es un simple bucle por los objetos y comparar con la propiedad TMiObjeto.Abrev. Además puedes implementar la opción CaseSensitive, o pasarlo como parámetro a tu rutina: IndexOfAbrev

saludos

Jome
24-11-2005, 12:00:00
No te equivocas, indexOf le tienes que pasar un TObject y te dice si está o no.

Implementarlo es bastante fácil, es un simple bucle por los objetos y comparar con la propiedad TMiObjeto.Abrev. Además puedes implementar la opción CaseSensitive, o pasarlo como parámetro a tu rutina: IndexOfAbrev

saludos
¿No crees que será más rápido el método Find (o IndexOf) de TStringList que el que pueda implementar yo recorriendo los objetos y comparando el campo Abbrev?

roman
24-11-2005, 16:36:55
¿No crees que será más rápido el método Find (o IndexOf) de TStringList que el que pueda implementar yo recorriendo los objetos y comparando el campo Abbrev?

Quizá no sea mucho más eficiente pero una cosa es cierta. Ya está hecho. Es una cuestión de gustos claro, y sé que difiero de Lepe en este aspecto ;) , pero yo preferiría el TStringList por lo mismo que ya has mencionado.

// Saludos

Lepe
24-11-2005, 17:11:16
¿No crees que será más rápido el método Find (o IndexOf) de TStringList que el que pueda implementar yo recorriendo los objetos y comparando el campo Abbrev?

En delphi escribe TStringList.IndexOf, ahora mantén la tecla CTRL pulsada mientras haces clic sobre IndexOf, irás directamente a su implementación, si no está ahí, tendrás el Inherited del TStrings, y mira el código fuente que usa la VCL. Te dará muchas pistas de como implementarlo bien.

saludos