2010-01-28 13 views
6

Considere esta situación: tengo un simulador de acuario en el que tengo 5 tipos diferentes de peces. Los diferentes tipos significan diferentes atributos (velocidad, color, hambre, etc.). ¿Qué sucede si quiero que el usuario de mi simulador pueda crear un nuevo tipo de pez y darle sus valores por sus atributos?¿Nuevas clases creadas por los usuarios?

¿Cómo es implementado por el programador? ¿Necesito algún tipo de "manejo de eventos" que agregará un grupo específico de líneas de código en mi clase "Fish"? ¿Es eso incluso un pensamiento válido?

(En caso de que sea esencial, el lenguaje es Java. Y para evitar malentendidos y evitar comentarios como "¿funciona esta unidad?", Sí lo es. Pero no estoy buscando LA respuesta, tengo curiosidad por la concepto.)

EDIT: Sí, es malo que no mencioné la forma de interacción: una GUI.

Imagine una pestaña llamada "Agregar nuevas especies" que tiene un campo para cada atributo de los peces (tipo, velocidad, color, etc.). Entonces, el usuario rellena los campos con los valores apropiados y cuando hace clic en "agregar" se llama al constructor. Al menos así es como lo imagino. :)

+0

Interesante. Metaclases de Java en acción. –

Respuesta

0

Eche un vistazo a type object pattern. También google para él Acabo de dar una de las primeras referencias que encontré ...

También puede mirar el Reflection pattern ...

+0

El artículo que me lo dejó completamente claro es este: http://gameprogrammingpatterns.com/type-object.html ¡Gracias, excelente patrón en general y en un lugar específico! –

1

me acaba de utilizar un mapa:

class Fish 
{ 
    Map<String,String> attributes = new HashMap<String,String>(); 
    setBusterFish() 
    { 
    attributes.put("speed", "5"); 
    attributes.put("colour", "red"); 
    attributes.put("hunger", "10"); 
    attributes.put("name", "buster"); 
    } 
} 
1

Java es un lenguaje orientado a objetos, y se ocupa en las clases y objetos. La solución tentadora e ingenua sería hacer que su programa se ocupe de "clases" de peces, como lo hace con las clases de cualquier cosa, es decir, crear algún código Java y dejar que el compilador y el cargador lo introduzcan en el tiempo de ejecución.

Este acercamiento puede ser hecho para trabajar, con un poco de torpeza. Esencialmente, su codificación de "clases de Java dinámicas" probablemente terminará siendo mucho más grande y complicada de lo que realmente pretende su tarea.

Solo necesita hacer esto si realmente va a tener diferentes atributos (no solo valores diferentes de esos atributos) para sus diferentes peces; e incluso entonces hay soluciones más simples.

Por lo que se pregunta, creo que realmente solo necesitas una clase de Fish. Cuando el usuario define uno nuevo, lo que realmente define son los valores de los atributos.

Si realmente quiere atributos nuevos y dinámicos, entonces podría recorrer un largo camino usando, por ejemplo, a HashMap para almacenar pares nombre/valor. Puede dejar que el usuario agregue "legs"/"4" y luego imprimir ese nuevo atributo tal como está; pero no podías hacer que el pez caminara sobre esas patas porque te faltaría código para trabajar con el nuevo atributo.

+0

¿Qué sucede si define uno nuevo, luego crea otros dos de un tipo ya existente y luego quiere otro del tipo nuevo que creó antes? Los atributos "estándar" de cada tipo nuevo deben guardarse en algún lugar para que los usuarios no tengan que insertarlos cada vez. –

+0

De verdad, entonces, no está logrando que sus usuarios ingresen nuevos Peces: les está haciendo ingresar nuevos 'FishPrototypes' o' FishSpecies' o 'FishMetadata'. Entonces, si tuvieras 'clase Fish {private FishSpecies speciesInformation; } 'y luego crea una nueva' FishSpecies' para cada entrada; puede llamar fácilmente 'nuevo Pez (salmonSpeciesInformation)' cada vez que quiera un nuevo salmón. Otras posibilidades incluyen usar 'originalFish.clone()' para copiar un pez anterior, 'Fish.copyOf (originalFish)' o 'new Fish (originalFish)' ... hay muchos enfoques posibles. – Cowan

0

Deje que el usuario defina valores de atributo de una instancia de, digamos, una clase FishSpecies y proporcione a FishSpecies un método createFish que cree un pez de esa especie (es decir, que tenga esos valores de atributo). Hacer un seguimiento de todos los objetos de FishSpecies en una lista le otorga la oportunidad de administrar objetos de FishSpecies y crear objetos de Fish de especies determinadas.

Si entiendo su pregunta correctamente, entonces creo que complicar las cosas más que esto es un error.

Cuestiones relacionadas