[ Foro de C# ]

duda sobre colecciones

24-Jun-2014 20:00
Invitado (n)
3 Respuestas

mi consulta es si tengo una clase a que hereda de una clase b y tengo que hacer una coleccion de  la clase a para que me guarde cosas de otras 3 clases (llamemoslas c d y e) que heredan de esta clase a...
el metodo para agregar estos obj seria?

 
 public bool AddEnemy(Enemigo Pistol,Enemigo LanzaC, Enemigo Rifle)
        {
            bool agrego=false;
           if (((SreachEnemy(Pistol.NOMBRE) == null)||(SreachEnemy(LanzaC.NOMBRE==null))||(SreachEnemy(Rifle.NOMBRE==null))
            {if (SreachEnemy(Pistol.NOMBRE) == null)
                {
                Pistoleros.Add(Pistol);
                agrego=true;
                }
                if (SreachEnemy(LanzaC.NOMBRE) == null)
                {
                Lanza.Add(LanzaC);
                agrego=true;
                }
               if (SreachEnemy(Rifle.NOMBRE) == null)
                {
                Rifleros.Add(Rifle);
                agrego=true;
                }
            }
            else
                agrego=false;
            return agrego;
 
        }
 



26-Jun-2014 09:28
Nacho Cabanes (+31)

Ahí falta mucho código para tener claro lo que estás haciendo y cómo, pero en general yo intentaría optar por una única lista "Enemigos", que guardara datos de todos ellos, en vez de crearte 3 (o 5) listas paralelas. La forma sería la misma que estás usando (.Add), pero yendo todos los datos a una única lista.

Si todos los datos "heredan" de la clase Enemigo (o de la clase A), parece razonable que haya una única lista, lo que podría simplificar la gestión de todo tu código. Basta con que "guardes a ciegas" en ella todo lo que quieras, y posteriormente compruebes el tipo de cada elemento que obtengas de ella.


27-Jun-2014 22:40
Invitado (n)

entonces seria algo asi?

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace GUia_Interfaces
{
    public class ColeccionEnemigos
    {
        private List<Enemigo> Enemy = new List<Enemigo>();
 
        public bool AddEnemy(Enemigo C)
        {
            bool agrego = false;
            if (SreachEnemy(C.NOMBRE) == null)
            {
                Enemy.Add(C);
                agrego = true;
            }
            else
                agrego = false;
            return agrego;
 
        }
        public Enemigo SreachEnemy(string nombre)
        {
            Enemigo C = null;
            foreach (Enemigo aux in Enemy)
            {
                if (aux.NOMBRE == nombre)
                {
                    C = aux;
                }
            }
            return C;
        }
        public bool QuitCivil(string Nombre)
        {
            bool elimino = false;
            foreach (Enemigo aux in Enemy)
            {
                if (aux.NOMBRE == Nombre)
                {
                    Enemy.Remove(aux);
                    break;
                }
            }
            return elimino;
 
        }
 
        public List<Enemigo> Devolvertodos()
        {
            List<Enemigo> sublista = new List<Enemigo>();
            foreach (Enemigo aux in Enemy)
            {
                sublista.Add(aux);
            }
            return sublista;
        }
 
 
    }
}
 



la consigna del ejercicio es
1 ? Definir la clase abstracta Personaje con los siguientes atributos: Nombre, totalHP, actualHP.
Definir las clases Civil y Enemigo, que extiendan de Personaje.
La clase Enemigo debe ser una clase abstracta e incorporara el atributo: daño.
Definir las subclases Pistolero, Riflero y LanzaCohetes que extiendan de Enemigo.
Cree una interface IAtacante con los siguientes métodos:
? apuntar : recibirá como parámetro un Enemigo, retornara la exactitud apuntada en un rango de 10 a 100. Si la exactitud apuntada es de 10 tendrá pocas posibilidades de hacerle algún daño al enemigo. Si la exactitud es de 100 de seguro le hará el mayor daño al enemigo.
? disparar : recibirá como parámetro un Enemigo y la exactitud apuntada, retornara el daño producido al enemigo (tener en cuenta la exactitud apuntada)
? recargar : no recibirá nada por parámetro y retornara bool (true si recargo, false si hubo algún problema, por ejemplo no tiene más municiones)
? estaVivo : recibirá como parámetro un Enemigo, retornara bool (true si está vivo, false si esta muerto).
Definir la clase Jugador que extienda de Personaje e implementar la interface IAtacante.
Crear las clases ColeccionEnemigos (donde guardara pistoleros, rifleros y lanzacohetes) y ColeccionCiviles con los métodos básicos de una colección.
El programa debe crear una colección de enemigos y otra de civiles, solo una instancia de jugador. Solicite al usuario que ingrese la cantidad de enemigos entre 1 y 5, haga lo mismo con civiles.
Luego el usuario indicara a que enemigo quiere disparar de acuerdo a la cantidad de enemigos cargados (números del 1 al 5). Ejecutara la acción apuntar y luego disparar de la instancia jugador sobre el enemigo seleccionado. Luego se verificara si el enemigo sigue vivo o no llamando al método EstaVivo. Esta operación deberá mostrar por pantalla el estado del enemigo luego de cada disparo.


01-Jul-2014 16:48
Nacho Cabanes (+31)

Sí, ese fragmento está bien. Hay algún error menor, como que la función de búsqueda se llama "SreachEnemy" en vez de "SearchEnemy", pero la lógica parece la correcta.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)