Tengo una clase de 3 listas vinculadas diferentes (para guardar las entidades en un juego en el que estoy trabajando). Las listas son todos objetos con el mismo tipo base, pero los mantengo separados por razones de procesamiento. Tenga en cuenta que IEntity, IObject e IUndead heredaron de IEntity.C#, forma genérica para acceder a diferentes listas dentro de una clase
public class EntityBucket
{
public LinkedList<IEntity> undeadEntities;
public LinkedList<IEntity> objects;
public LinkedList<IEntity> livingEntities;
public EntityBucket()
{
undeadEntities = new LinkedList<IEntity>();
objects = new LinkedList<IEntity>();
livingEntities = new LinkedList<IEntity>();
}
public LinkedList<IEntity> GetList(IObject e)
{
return objects;
}
public LinkedList<IEntity> GetList(IUndead e)
{
return undeadEntities;
}
public LinkedList<IEntity> GetList(ILiving e)
{
return livingEntities;
}
}
tengo 3 métodos para recuperar cada una de las listas, en la actualidad en función de sus parámetros. El hecho de que haya 3 está bien, ya que sé que cada lista requerirá de algún modo su propio acceso. Sin embargo, pasar un objeto instanciado no es ideal, ya que es posible que desee recuperar una lista en algún lado sin tener a mano un objeto de tipo similar. Tenga en cuenta que el objeto aquí ni siquiera se utiliza en los métodos GetList, solo están ahí para determinar qué versión usar. Este es un ejemplo en el que tengo una instancia de objeto que nos ocupa:
public void Delete(IUndead e, World world)
{
.....
LinkedList<IEntity> list = buckets[k].GetList(e);
.....
}
no me gusta esta implementación actual, ya que no siempre se puede tener un objeto instanciado a mano (al representar las entidades, por ejemplo). Estaba pensando en hacerlo genéricamente, pero no estoy seguro si esto es posible con lo que quiero hacer. Con esto también necesito 3 métodos Delete (y 3 de cualquier otro, como add, etc.), uno para cada tipo, IUndead, IObject y ILiving. Siento que esta no es la forma correcta de hacerlo.
Voy a publicar lo que he tratado de hacer hasta ahora bajo petición, pero mis genéricos son bastante malos y creo que sería un desperdicio para cualquiera leer esto también.
Finalmente, el rendimiento es muy importante. No estoy optimizando prematuramente, estoy optimizando la publicación porque ya tengo código de trabajo, pero necesito que vaya más rápido. Los métodos getlist se invocarán con mucha frecuencia y deseo evitar cualquier verificación explícita de tipos.
¿Cuáles son los parámetros en los métodos 'GetList' si no se usan realmente? Parece que podrías exponer las listas como propiedades en lugar de como métodos. – Lee
Así es como solía hacerlo, pero como dije, tengo que tener 3 versiones de cada método que acceden a estas listas. No quiero 3, prefiero una versión genérica. Esto no se puede hacer llamando explícitamente a la lista como una propiedad. Las listas deben ser recuperadas de forma genérica. La lista correcta para elegir tendrá que determinarse usando algún tipo u otro. – Denzil