Free Web Site - Free Web Space and Site Hosting - Web Hosting - Internet Store and Ecommerce Solution Provider - High Speed Internet
Search the Web

Ejemplo


Una de las reglas básicas del acceso a los métodos abstractos, es que no se puede acceder a un método no definido en la clase.

Para aplicar los conocimientos sobre herencia y acceso , se desarrolló un ejemplo que consiste en diseñar un objeto de supermercado que represente un Producto, derivando a un producto perecible. Finalmente se deriva nuevamente la clase Producto perecible para crear una clase Fruta.

Diseño del producto básico

Consiste en dos métodos públicos, nombre y código , además de dos métodos abstractos que retornan el precio de venta y el precio de costo. Se declaran abstractos ya que se hace la suposición que dependen de factores que son atributos de clases derivadas, como el promedio de días en que los productos pasan en bodegas y otros del mismo estilo.

abstract class Producto
{
    public static int codigo;    
    public static String nombre;
    
    public Producto(int codigo,String nombre)
    {
        this.codigo = codigo;
        this.nombre = nombre;    
    }
    
    abstract public int obtenerPrecio();
    abstract public int obtenerCosto(); 
}

Extendiendo la clase Producto

Se crea una clase que representa a un Producto perecible, que tiene como propiedad que el precio de venta depende del tiempo de almacenaje en bodega.

Ya que no sabemos este dato para todos los días perecibles, y sí sabemos (supuesto) la ecuación que determina el precio mínimo, se declaran dos métodos abstractos, que retornan el tiempo de bodega y de estante.

abstract class ProdPerecible extends Producto
{
    abstract public double obtenerDiasBodega();
    abstract public double obtenerDiasEstante();
    
    public ProdPerecible(int codigo,String nombre)
    {
        super(codigo,nombre);
    }
        
    public int obtenerPrecioMinimo()
    {
        double f = 0.253 * obtenerDiasEstante(); 
        f += 0.145 * obtenerDiasBodega();    
        f *= (double) obtenerCosto();
        
        return (int) Math.round(f);
    }
}

*nota : aunque aquí se hubieran implementado los dos métodos abstractos mencionados, la clase seguiría siendo abstracta, ya que todavía no se ha implementado los métodos obtenerPrecio y obtenerCosto.


Extendiendo la clase Producto Perecible

Creamos una clase Fruta, la cual implementa a las clases bases e incorpora el atributo de la venta promedio diaria.

class Fruta extends ProdPerecible
{
    public static double promDiasBodega = 1.45;
    public static double promDiasEstante = 3.20;
    public static int costo;
    
    public double ventaPromedioDiaria; 
    
    public Fruta(int codigo,String nombre,int costo,double ventaPromDiaria)
    {
        super(codigo,nombre);    
        this.costo = costo;
        this.ventaPromedioDiaria = ventaPromDiaria;
    }
    
    
    public double obtenerDiasBodega()
    {
        return promDiasBodega;    
    }
    
    public double obtenerDiasEstante()
    {
        return promDiasEstante;
    }

    public int obtenerCosto()
    {
        return costo;    
    } 
    
    public int obtenerPrecio()
    {
        return (int) Math.round(obtenerPrecioMinimo() * 1.25);    
    }    

    public double ventaDiariaPromedio()
    {
        return ventaPromedioDiaria;    
    }

}

Como ya sabemos por el tema de la herencia, un objeto Producto puede hacer referencia a un objeto Producto perecible y a un objeto Fruta , estando sólo limitado a acceder a los métodos y atributos declarados en su clase.

Ej :
     Producto KgCiruela = new Fruta(  );  
     /* ERROR !  --> método no declarado en la clase Producto */  
     int dias_bodega = kgCiruela.obtenerDiasBodega();


Programa de prueba

Se crearon tres objetos de tipo Fruta, cada uno referenciado por un objeto Producto, ProdPerecible y Fruta respectivamente.

Para ver todos los accesos que se tienen desde los diferentes objetos, se crearon tres métodos correspondientes.



Código fuente

class pruebaProducto
{
    
    public static void impAccesosProducto(Producto p)
    {
        System.out.print("\tproducto : " + p.nombre);
        System.out.println("\t\tcodigo : " + p.codigo);    
        System.out.print("\tcosto : " + p.obtenerCosto());
        System.out.println("\t\t\tprecio venta : " + p.obtenerPrecio());        
    }
    
    public static void impAccesosProdPerecible(ProdPerecible p)
    {
        impAccesosProducto(p);
        
        System.out.print("\tdias bodega : " + p.obtenerDiasBodega());
        System.out.println("\t\tdias estante : " + p.obtenerDiasEstante());
        System.out.print("\tprecio minimo : " + p.obtenerPrecioMinimo());
    }
    
    public static void impAccesosFruta(Fruta p)
    {
        impAccesosProdPerecible(p);
        System.out.println("\t\tventa (diaria) : " + p.ventaDiariaPromedio() + " kg.");    
    }
    
    public static void main(String arg[])
    {
        System.out.println("\n\tACCESOS DE PRODUCTO");
          System.out.println("\t-------------------\n");
        
        Producto kgNaranja = new Fruta(3500,"kg. naranja",215,1067.8);
        
        impAccesosProducto(kgNaranja);
        
        System.out.println("\n\tACCESOS DE PRODUCTO PERECIBLE");
          System.out.println("\t-----------------------------\n");
        
        ProdPerecible kgManzana = new Fruta(2100,"kg. manzana",240,946.2);
        
        impAccesosProdPerecible(kgManzana);
        
        System.out.println("\n\n\tACCESOS DE FRUTA");
            System.out.println("\t----------------\n");
        
        Fruta kgPera = new Fruta(3200,"kg. pera",250,788.5);
        
        impAccesosFruta(kgPera);
    
        System.out.println();
    }    
}
Bajar codigo