[ Foro de retos de programación ]

Duda array de objetos

21-Jun-2017 13:48
Invitado (Rubén)
2 Respuestas

Buenas tardes a todos y gracias por adelantado.

Estoy haciendo el curso de C# de Nacho y en arrays de objetos me ha surgido una duda que no sé solucionar, ni siquiera por qué me sale. Adjunto código más abajo:

La línea comentada //cA[1].Paginas = 200;  me da error CS1061.
Intento modificar el valor de paginas mediante el descriptor de acceso Paginas y me da error. El problema debe venir por el array, ya que si hago lo mismo con objetos individuales(sin array) sí que me  complia y me funciona.

¿Alguna ayuda, que me estoy volviendo loco ya?

Muchísimas gracias a todos.


public class PruebasArraysObjetos
{
	public static void Main()
	{
	
		claseA[] cA = new claseA[2];		
		cA[0] = new claseA();
		cA[1] = new claseB();	
		//cA[1].Paginas = 200;      //Línea que da error
		cA[0].Mostrar();
		cA[1].Mostrar();
	}
	
	public class claseA
	{
		public virtual void Mostrar()
		{
			Console.WriteLine("Esto es la clase A");
		}
	}
	
	public class claseB : claseA
	{
		private int paginas;
		
		public override void Mostrar()
		{
			Console.WriteLine("Esto es la clase B");
			Console.WriteLine(paginas);
		}
		public int Paginas
		{
			get
			{
				return paginas;
			}
			set
			{
				paginas = value;
			}
		}	
	}
}


 


25-Jun-2017 00:02
Nacho Cabanes (+83)

Pero es que el error que te da "es normal": tu array es de objetos "claseA",  en los objetos de esa clase no existe la propiedad Paginas.

Se me ocurren un par de formas de solucionarlo: rediseñar  ;-)  o hacer un forzado de tipos. Supondré que ese es tu diseño de pruebas y que quieres conservarlo, así que la alternativa sería ésta:


using System;

public class PruebasArraysObjetos
{
    public static void Main()
    {
 
        claseA[] cA = new claseA[2];        
        cA[0] = new claseA();
        cA[1] = new claseB();   
        ((claseB) cA[1]).Paginas = 200;      //Línea que da error
        cA[0].Mostrar();
        cA[1].Mostrar();
    }
 
    public class claseA
    {
        public virtual void Mostrar()
        {
            Console.WriteLine("Esto es la clase A");
        }
    }
 
    public class claseB : claseA
    {
        private int paginas;
 
        public override void Mostrar()
        {
            Console.WriteLine("Esto es la clase B");
            Console.WriteLine(paginas);
        }
        public int Paginas
        {
            get
            {
                return paginas;
            }
            set
            {
                paginas = value;
            }
        }   
    }
}


 


26-Jun-2017 13:20
Invitado (Rubén)

Muchas gracias Nacho.

Yo leí en tus apuntes y supongo que me confundí.
Dices--> El array es de "Animales" y contiene objetos de otras subclases<--. Por eso entendí que podría usar también las propiedades de esos objetos de las subclases.

En cualquier caso, entiendo lo que quieres decir y el porqué no funciona.

Lo que dices en los apuntes es:
Además, existe una peculiaridad curiosa: podemos crear un array de "Animales", que realmente contenga objetos de distintas subclases (en este caso, unos de ellos serán perros, otros gatos, etc.),
Animal[] misAnimales = new Animal[3];
misAnimales[0] = new Perro();
misAnimales[1] = new Gato();
misAnimales[2] = new GatoSiames();

Gracias por la respuesta. He usado el cast que me has pasado y funciona perfectamente.

P.D. Estoy liadillo con los Space Invaders, supongo que tendré alguna consulta más si no soy capaz de solucionarla tras pelearme. Me voy a inscribir, ya que veo que funciona bien.

Muchas gracias de nuevo.






(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.)