[ Foro de C# ]
Quiero realizar este ejercicico (el 7.5.3) del libro introduccion a c# de Nacho Cabanes el problema dice asi:
Crea una clase Casa, con una superficie (por ejemplo, 90 m2) y un método "MostrarEstado" que escriba su superficie. Cada casa debe contener 3 puertas. Las puertas tendrán un ancho, un alto y un método "MostrarEstado" que muestre su ancho y su alto y la superficie de la casa en la que se encuentran. Crea un programa de prueba que cree una casa y muestre sus datos y los de sus tres puertas.
Lo que no puedo realizar es que la clase Puerta "conozca" a a la clase Casa y esto provoca que mis objetos de Puerta no puedan mostrar la superficie del objeto de Casa. Me podrian ayudar?
Lo primero que veo raro es que sean las puertas las que contengan la casa... Creo que lo más sencillo es crear un objeto casa que contenga objetos puerta, como en la realidad. El resto parece un problema de "alcance". Algo en la declaración de las clase que hace que no sean visibles la una para la otra y eso es más difícil de solucionar sin ver el código. Revisa las declaraciones de las clases, casi seguro que desde allí vas a encontrar rápido el problema.
Un saludo.
Caranim.
Checa la clase Casa:
public class Casa
{
private float superficie = 65f;
Puerta p1 = new Puerta();
Puerta p2 = new Puerta();
Puerta p3 = new Puerta();
public void mostrarEstado(){
Console.WriteLine("Superficie de la casa {0} m2", superficie);
Console.WriteLine();
Console.WriteLine("Puertas");
p1.mostrarEstado();
p2.mostrarEstado();
p3.mostrarEstado();
}
}
La clase Puerta:
public class Puerta
{
private float ancho = 5f;
private float alto = 10f;
public void mostrarEstado(){
Console.WriteLine("Ancho {0}", ancho);
Console.WriteLine("Alto {0}", alto);
Console.WriteLine();
}
}
y mi clase con el Main:
public class pruebaCasa
{
public static void Main(string[] argumentos){
Casa casa = new Casa();
casa.mostrarEstado();
Console.ReadKey(true);
}
}
Si te fijas si creo los objetos Puerta en la Casa y no creo una Casa en las Puertas, así como lo tengo la casa muestra su estado y el de sus 3 puertas, pero yo lo que quiero es que los objetos de ambas clases se comuniquen y cada puerta en su método "mostrarEstado" muestre también la superficie de la casa. Esa es mi duda y agradecería mucho la ayuda.
Casi lo tienes.
La clase "Puerta" deberá tener un atributo de tipo "Casa", pero no darle valor con "new" (sería recursividad indirecta), sino que el valor se le dé desde la Casa, o bien usando un método Set o bien desde el constructor en el momento de crear la puerta.
public class Casa
{
private float superficie = 65f;
private Puerta p1 = new Puerta();
private Puerta p2 = new Puerta();
private Puerta p3 = new Puerta();
public float getSuperficie(){
return superficie;
}
public void mostrarEstado(){
Console.WriteLine("Superficie de la casa {0} m2", superficie);
Console.WriteLine();
Console.WriteLine("Puertas");
p1.setSuperficie(this);
p1.mostrarEstado();
p2.setSuperficie(this);
p2.mostrarEstado();
p3.setSuperficie(this);
p3.mostrarEstado();
}
}
public class Puerta
{
private float ancho = 5f;
private float alto = 10f;
private Casa casa;
public void setSuperficie(Casa casa){
this.casa = casa;
}
public void mostrarEstado(){
Console.WriteLine("Ancho {0}", ancho);
Console.WriteLine("Alto {0}", alto);
Console.WriteLine("{0}",casa.getSuperficie());
Console.WriteLine();
}
}
Agradezco el consejo Nacho!, solo que no se si asi como le hice ya esta bien, ya me muestra los datos pero no se si la forma sea la correcta, ¿si esta bien?
(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.)