• Lunes 23 de Diciembre de 2024, 13:14

Autor Tema:  Problema al Heredar clases  (Leído 3305 veces)

Boxcarpilot

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Problema al Heredar clases
« en: Domingo 5 de Abril de 2009, 19:15 »
0
ENUNCIADO DEL PROBLEMA
Las clases Cuadrado? Círculo y Triángulo tienen que calcular su área y perímetro. Por lo tanto tiene sentido crear una  clase genérica llamada  Figura. Elabore una aplicación que haga lo antes señalado.  Imprima el perímetro y el área de cada figura


Pues ya lo tengo casi listo (exceptuando impresiones), pero no puedo imprimir mientras no pueda retornar variables al programa principal....

Pues asi lo tengo hasta ahora

Código: Java
  1. import javax.swing.JOptionPane;
  2.  
  3.  //clase madre
  4. class Figura
  5. {
  6.    private float side1,side2,rad,ladob,ladoc,ladod,altura;
  7.    
  8.         void atrapando(float a, float b, float c, float tri1, float tri2, float tri3, float tri4)
  9.         {
  10.             // los lados del cuadrado
  11.             side1=a;
  12.             side2=b;
  13.             //radio del circulo
  14.             rad=c;
  15.            
  16.             //los elementos del triangulo
  17.             altura=tri1;
  18.             ladob=tri2;
  19.             ladod=tri3;
  20.             ladoc=tri4;
  21.         }
  22.        
  23.         //Cuadrado
  24.         class Cuadrado extends Figura
  25.         {
  26.             float areacua,pericua;
  27.            
  28.             float recua()
  29.             {
  30.                 areacua=side1*side2;
  31.                 return areacua;
  32.             }
  33.            
  34.             float pericua()
  35.             {
  36.                 pericua=side1*4;
  37.                 return pericua;
  38.             }
  39.         }
  40.         class Circu extends Figura
  41.         {
  42.             double areacir, pericir;
  43.            
  44.             double cirarea()
  45.             {
  46.                 areacir=3.14*(Math.pow(rad,2));
  47.                 return areacir;
  48.             }
  49.             double cirpe()
  50.             {
  51.                 pericir= 2*3.14*rad;
  52.                 return pericir;
  53.             }   
  54.         }
  55.        
  56.         class Tri extends Figura
  57.         {
  58.             double areatri, pertri;
  59.            
  60.             double aretri()
  61.             {
  62.                 areatri=(ladob*altura)/2;
  63.                 return areatri;
  64.             }
  65.            
  66.             double peritri()
  67.             {
  68.                 pertri=ladob+ladoc+ladod;
  69.                 return pertri;
  70.             }      
  71.            
  72.         }      
  73.        
  74.     }
  75.    
  76.    
  77.  
  78.  
  79.  //Inicio del programa principal
  80. class Areas{
  81.    
  82.     public static void main(String args[])
  83.     {
  84.         float lad,lad2,radio,tri1,tri2,tri3,tri4;
  85.         Figura obj=new Figura();
  86.        
  87.         String lec=JOptionPane.showInputDialog(null,"Coloque el 1er lado del cuadrado     :",JOptionPane.INFORMATION_MESSAGE);
  88.         String lec2=JOptionPane.showInputDialog(null,"Coloque el 2do lado del cuadrado :",JOptionPane.INFORMATION_MESSAGE);
  89.         lad=Float.parseFloat(lec);
  90.         lad2=Float.parseFloat(lec2);
  91.        
  92.        
  93.         String lecra=JOptionPane.showInputDialog(null,"Coloque el radio del circulo :",JOptionPane.INFORMATION_MESSAGE);
  94.         radio=Float.parseFloat(lecra);
  95.        
  96.        
  97.        
  98.         String lectua=JOptionPane.showInputDialog(null,"Coloque la altura del triangulo :",JOptionPane.INFORMATION_MESSAGE);
  99.         String lectua2=JOptionPane.showInputDialog(null,"Coloque la base(lado B) del triangulo :",JOptionPane.INFORMATION_MESSAGE);
  100.         String lectua3=JOptionPane.showInputDialog(null,"Coloque el lado D del triangulo :",JOptionPane.INFORMATION_MESSAGE);
  101.         String lectua4=JOptionPane.showInputDialog(null,"Coloque el lado C del triangulo :",JOptionPane.INFORMATION_MESSAGE);
  102.         tri1=Float.parseFloat(lectua);
  103.         tri2=Float.parseFloat(lectua2);
  104.         tri3=Float.parseFloat(lectua3);
  105.         tri4=Float.parseFloat(lectua4);
  106.        
  107.         obj.atrapando(lad,lad2,radio,tri1,tri2,tri3,tri4);
  108.        
  109.         //Imprimiendo Todo
  110.        
  111.         JOptionPane.showMessageDialog(null, "El area del Cuadrado es : "+obj.recua);
  112.     }
  113. }
  114.  


El problema esq en la linea 111, al llamar a "obj.recua" manda error, que puede estar pasando?

lucbel

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Problema al Heredar clases
« Respuesta #1 en: Lunes 6 de Abril de 2009, 12:56 »
0
Podrias hacer una captura del error?

Decir que clase de exception te da.

Boxcarpilot

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Problema al Heredar clases
« Respuesta #2 en: Martes 7 de Abril de 2009, 03:21 »
0
Pues me dice q el obj.recua NO existe

grandzam

  • Miembro MUY activo
  • ***
  • Mensajes: 118
    • Ver Perfil
Re: Problema al Heredar clases
« Respuesta #3 en: Martes 7 de Abril de 2009, 07:42 »
0
Hola pues, como veo, estas utilizando la herencia mediante clases interiores, por lo cuál, al crear el objeto figura o en algún otro método deberías crear el objeto cuadrado, circulo, etc... Recuerda que al utilizar clases interiores, éstas solo pueden ser creadas dentro de la clase que las engloba. :good:

goldenscriptup

  • Miembro activo
  • **
  • Mensajes: 40
  • Nacionalidad: mx
    • Ver Perfil
Re: Problema al Heredar clases
« Respuesta #4 en: Martes 7 de Abril de 2009, 09:38 »
0
Estas aplicando mal la Herencia, por que estas usando como tu clase general la clase Figura y dentro de esa clase estas declarando otras clases, diriamos subclases de la clase Figura y aparte a las subclases quieres extenderlas o Heredarlas de la clase Figura, Eso esta mal :blink:

No te recomiendo que quieras usar una clase para inicializar todas las variables, por que si nada mas quieres saber el perimetro de un cuadrado solo mandas a llamar la clase Cuadrado o si quieres saber los datos de un circulo solo mandas a llamar la clase Circulo y asi sucesivamente. El problema que te ocasionaria si tienes una solo clase que inicializa todas las variables de las clases Cuadrado, Circulo y Triangulo tendrias que mandarle todos los parametros a esta funcion.
Citar
 void atrapando(float a, float b, float c, float tri1, float tri2, float tri3, float tri4)
         {
             // los lados del cuadrado
             side1=a;
            side2=b;
             //radio del circulo
             rad=c;
           
             //los elementos del triangulo
            altura=tri1;
             ladob=tri2;
             ladod=tri3;
            ladoc=tri4;
        }
aunque no fuera necesario enviar todos los parametros.

Citar
El problema esq en la linea 111, al llamar a "obj.recua" manda error, que puede estar pasando?
En este problema haces referencia como si el metodo "recua" le perteneciera a la clase Figura pero no es asi, el metodo "recua" le pertenece a la subclase Cuadrado.

En lo personal yo haria 4 clases independientes. ^_^
Una clase Cuadrado, Circulo y Triangulo. Cada clase debe de tener sus metodos para realizar sus operaciones y su constructor para inicializar las variables necesarias y la otra clase seria LlamarFiguras u otro nombre pero que esa clase se encargue de llamar a las demas clases.

Aqui te pongo un ejemplo que te explica la idea y funciona, solo seria cuestion de que crearas las demas clases faltantes.

Creamos una clase Cuadrado
Código: Java
  1.  
  2. public class Cuadrado {
  3.     private float side1;
  4.    
  5.     //Constructor. Inicializa las variables cuando carga la clase
  6.     public Cuadrado(float a){
  7.         side1 = a;
  8.     }
  9.    
  10.     //Funcion que calcula el area.
  11.     float calcularArea(){
  12.         return side1*side1;
  13.     }
  14.    
  15.     //Funcion que calcula el perimetro
  16.     float calcularPerimetro(){
  17.         return side1 * 4;
  18.     }   
  19. }
  20.  

Creamos una Clase LlamarFiguras
Código: Java
  1.  
  2. import javax.swing.JOptionPane;
  3.  
  4. public class LlamarFiguras {
  5.     public static void main(String args[]){
  6.        
  7.         float area, perimetro;
  8.         /*Se le envia el parametro del lado del cuadro
  9.         para que el constructor lo cache e inicialice la variable side1. Solamente se manda un lado
  10.         del cuadrado por que todos sus lados son iguales*/
  11.         Cuadrado datoscuadrado = new Cuadrado(5);
  12.         area = datoscuadrado.calcularArea();
  13.         perimetro = datoscuadrado.calcularPerimetro();
  14.        
  15.         JOptionPane.showMessageDialog(null,"El area es: "+area+" n El perimetro es: "+perimetro);
  16.        
  17.        
  18.         /*De aqui para abajo puedes mandar a llamar las demas clases que serian
  19.          Circulo y Triangulo.
  20.          */
  21.     }
  22. }
  23.  

Espero que te sea de utilidad y cualquier duda no dudes en postearla. Saludos :good:
« última modificación: Martes 7 de Abril de 2009, 10:23 por goldenscriptup »
"Sorprendedme retadme desadfiadme y desafio a vos" :huh:

lucbel

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Problema al Heredar clases
« Respuesta #5 en: Martes 7 de Abril de 2009, 10:11 »
0
Comento lo que he visto.

Uno. Tienes Cuadrado triangulo Dentro de Figura. Es lo que se llama una Inner Class.  Si se trata de un ejercicio de herencia seguro que se trata de un error.
Deberian estar fuera de la classe figura.

Dos. obj.recua  recua es un metodo

        Parametro
             objeto.nombreParametro;

       metodo
             objeto.nombreMetodo();

    Los metodos se llaman con los parentesis y los parametros que tengan definido, en caso de no tener iran vacios.

Espero haberte ayudado.

grandzam

  • Miembro MUY activo
  • ***
  • Mensajes: 118
    • Ver Perfil
Re: Problema al Heredar clases
« Respuesta #6 en: Martes 7 de Abril de 2009, 16:02 »
0
Bueno pues, yo he visto varios códigos aplicando la herencia de esa forma, no es muy común que digamos pero el lenguaje lo permite, así es que no es que este mal. De hecho esta bien... sin embargo dentro de la clase que engloba a las demas clases debería crear el(los) objeto(s) que necesita.... Sería algo como una clase de objetos o algo asi... no recuerdo bien como se les nombra...

La herencia esta aplicada de una forma diferente a como se hace comúnmente... y sí, lo más común es que fueran clases separadas y figura para mí, sería una clase abstracta. De ahí, ya se extenderían las demás clases y se crearían en otra clase aparte...

SFRJ

  • Miembro MUY activo
  • ***
  • Mensajes: 115
    • Ver Perfil
Re: Problema al Heredar clases
« Respuesta #7 en: Miércoles 8 de Abril de 2009, 22:53 »
0
Tiene razon golden, eso que tu haces no es correcto. A eso se le llaman clases internas, y no tiene que ver con la herecia que tu necesitas para resolver este problema.
mira me explico:
En este primer ejemplo esto es la herencia correcta, la clase be tomara todos los atributos y metodos de la clase A.
Código: Java
  1.  
  2. public class A {
  3.  
  4. }
  5.  
  6. public class B extends A {
  7.  
  8. }
  9.  
  10.  
Este segundo ejemplo es correcto, pero no se denomina herencia, sino clase interna.Aunque si que se parece en algo a la herencia.
En este caso la clase B tendra acceso a los metodos private de la clase A al ser una clase interna.(ESTO ES LO QUE LE DIFERENCIA DE LA HERECIA)
Código: Java
  1.  
  2. public class A {
  3.     public class B {
  4.  
  5.      }
  6. }
  7.  
  8.  
RECUERDA:
1-LA SUBCLASE HEREDA SOLO METODOS Y ATRIBUTOS public
2-LA CLASE INTERNA TIENE ACCESO A METODOS Y ATRIBUTOS private DE LA CLASE ENVOLTORIO.

Saludos