02 febrero 2012

Java para C# - 05 - Clases

Un ejemplo de uso de clases en C#, que incluya herencia, métodos virtuales y la creación de un array de objetos podría ser así:


using System;

class Clases
{
    public static void Main(string[] args)
    {
        int numeroMesas = 5;
        int numeroMesitas = 5;
        int totalMesas = numeroMesas + numeroMesitas;
        Random generador = new Random();

        Mesa[] listaMesas = new Mesa[totalMesas];

        for (int i = 0; i < numeroMesas; i++)
            listaMesas[i] = new Mesa(generador.Next(50, 201),
                generador.Next(50, 201));

        for (int i = numeroMesas; i < totalMesas; i++)
            listaMesas[i] = new Mesita(generador.Next(40, 51),
                generador.Next(40, 51));

        for (int i = 0; i < totalMesas; i++)
            listaMesas[i].MostrarDatos();
    }
}


// -----------------------------------------------------------------

class Mesa
{
    protected int ancho, alto;

    public Mesa(int an, int al)
    {
        ancho = an;
        alto = al;
    }

    public virtual void MostrarDatos()
    {
        Console.WriteLine("Alto: {0}", alto);
        Console.WriteLine("Ancho: {0}", ancho);
        Console.WriteLine();
    }
}


// -----------------------------------------------------------------

class Mesita : Mesa
{
    public Mesita(int an, int al) : base (an, al)
    {
    }

    public override void MostrarDatos()
    {
        base.MostrarDatos();
        Console.WriteLine("(Mesita)");
        Console.WriteLine();
    }
}



En Java, los cambios (que no hayamos visto antes) son:

  • Para indicar la herencia se usa "extends", en lugar de ":"
  • Para apoyarnos en métodos (o constructores) de la clase base, en vez de "base", se usa "super" (pero  si queremos basarnos en otros constructores de la misma clase, se usaría  "this", igual que en C#).
  • No hace falta indicar que una función es virtual: eso es lo que se asume, a no ser que se indique lo contrario (usando la palabra "final").
  • El "override" se escribe antes del método, precedido por una arroba.
  • Al igual que en C#, no es recomendable (pero sí posible) incluir varias clases en un único fichero fuente. Pero en el caso de Java se generarán varios ficheros ".class", uno por cada clase, de los cuales sólo será realmente ejecutable el que contenga "main".
El resultado sería:


import java.io.*;
import java.util.Random;

class Clases
{
    public static void main(String[] args)
    {
        int numeroMesas = 5;
        int numeroMesitas = 5;
        int totalMesas = numeroMesas + numeroMesitas;
        Random generador = new Random();

        Mesa[] listaMesas = new Mesa[totalMesas];

        for (int i = 0; i < numeroMesas; i++)
            listaMesas[i] = new Mesa(generador.nextInt(150)+50,
                generador.nextInt(150)+50);

        for (int i = numeroMesas; i < totalMesas; i++)
            listaMesas[i] = new Mesita(generador.nextInt(40)+10,
                generador.nextInt(40)+10);

        for (int i = 0; i < totalMesas; i++)
            listaMesas[i].MostrarDatos();
    }
}


// -----------------------------------------------------------------

class Mesa
{
    protected int ancho, alto;

    public Mesa(int an, int al)
    {
        ancho = an;
        alto = al;
    }

    // En Java no hace falta "virtual": se da por sentado
    public void MostrarDatos()
    {
        System.out.println("Alto: "+ alto);
        System.out.println("Ancho: "+ ancho);
        System.out.println();
    }
}


// -----------------------------------------------------------------

class Mesita extends Mesa
{
    public Mesita(int an, int al)
    {
        super (an, al);
    }

    @Override
    public void MostrarDatos()
    {
        super.MostrarDatos();
        System.out.println("(Mesita)");
        System.out.println();
    }
}