Está en la página 1de 28

Programación interactiva

Oscar Bedoya
oscarbed@eisc.univalle.edu.co
Métodos abstractos
e interfaces
Clases y métodos abstractos

• Considere la siguiente jerarquía de clases

Figura

Circulo Cuadrado
Clases y métodos abstractos

• Considere la siguiente jerarquía de clases

Figura

Circulo Cuadrado

• Qué atributos y métodos


se pueden definir en la
clase Figura?
Clases y métodos abstractos

• Considere la siguiente jerarquía de clases

Figura

Circulo Cuadrado

• La clase Figura es muy general como para


implementar un método que sirva tanto para
un Circulo como para un Cuadrado
Clases y métodos abstractos

• Considere la siguiente jerarquía de clases

Figura

Circulo Cuadrado

• Tiene sentido crear un


objeto de la clase Figura?
Clases y métodos abstractos

• Existen clases de las cuales no se crean objetos, simplemente


sirven como una superclase que ayuda a guiar el comportamiento que
deben tener sus subclases

La clase Figura puede indicar que todas sus subclases deben tener
métodos obtenerArea y obtenerPerimetro
Cuando las subclases hereden de ella, deberán sobrescribir estos
métodos de tal forma que se calcule de forma específica para cada
figura

Figura
Clases y métodos abstractos

public abstract class Figura


{
public abstract String obtenerNombre();

public double obtenerArea()


{
return 0.0;
}
}
Clases y métodos abstractos

Con la palabra abstract


public abstract class Figura se indica que la clase es
{ abstracta

public abstract String obtenerNombre();

public double obtenerArea()


{
return 0.0;
}
}
Clases y métodos abstractos

public abstract class Figura


{
public abstract String obtenerNombre();

public double obtenerArea() •Definición del método


abstracto obtenerNombre
{ que retorna como un String
return 0.0; el tipo de figura
•Note que no tiene cuerpo,
}
solamente la firma
}
Clases y métodos abstractos

public abstract class Figura


{
public abstract String obtenerNombre();

public double obtenerArea() •Definición del método no


abstracto (concreto)
{ obtenerArea
return 0.0;
}
}
public class Circulo extends Figura
{
private double radio;
public Circulo(double r)
{
radio=r;
}
public double obtenerRadio()
{
return radio;
}
public double obtenerArea()
{
return Math.PI*radio*radio;

}
public String obtenerNombre()
{
return "CIRCULO";
}
}
public class Circulo extends Figura Hereda de la clase
{ abstracta Figura
private double radio;
public Circulo(double r)
{
radio=r;
}
public double obtenerRadio()
{
return radio;
}
public double obtenerArea()
{
return Math.PI*radio*radio;

}
public String obtenerNombre()
{
return "CIRCULO";
}
}
public class Circulo extends Figura
{
private double radio;
public Circulo(double r)
{
radio=r;
}
public double obtenerRadio()
{
return radio;
}
Sobrescribe el método no
public double obtenerArea()
abstracto para que calcule
{ el área de un circulo
return Math.PI*radio*radio;

}
public String obtenerNombre()
{
return "CIRCULO";
}
}
public class Circulo extends Figura
{
private double radio;
public Circulo(double r)
{
radio=r;
}
public double obtenerRadio()
{
return radio;
}
public double obtenerArea()
{
return Math.PI*radio*radio;

}
Sobrescribe el método
abstracto para que calcule
public String obtenerNombre()
retorne la palabra
{ CIRCULO
return "CIRCULO";
}
}
public class Cuadrado extends Figura Cuadrado hereda de la
{ clase abstracta Figura
private double lado;
public Cuadrado(double l)
{
lado=l;
}
public double obtenerLado()
{
return lado;
}
Sobrescribe el método
public double obtenerArea()
calculando el valor para un
{ cuadrado
return lado*lado;

}
Sobrescribe el método
public String obtenerNombre()
abstracto
{
return "CUADRADO";
}
}
public class Cuadrado extends Figura Cuadrado hereda de la
{ clase abstracta Figura
private double lado;
public Cuadrado(double l)
{
lado=l;
}
public double obtenerLado()
{
return lado;
}
Sobrescribe el método
public double obtenerArea()
calculando el valor para un
{ cuadrado
return lado*lado;

}
Sobrescribe el método
public String obtenerNombre()
abstracto
{
return "CUADRADO";
}
Figura-Cuadrado-Circulo-Uso
}
Sistema de nómina utilizando herencia
Una compañía paga a sus empleados en forma semanal. La compañía
tienes 4 tipos de empleados:
•Empleados asalariados que reciben un pago semanal fijo sin
importar el número de horas
•Empleados por horas que reciben un sueldo por horas y pago por
tiempo extra
•Empleados por comisión que reciben un porcentaje por sus
ventas
•Empleados asalariados por comisión que reciben un salario base
mas un porcentaje de sus ventas
Para este periodo de pago, la compañía ha decidido compensar a los
empleados asalariados por comisión, agregando un 10% a sus salarios
La compañía desea implementar una aplicación Java que realice sus
cálculos de nominas
Empleado

EmpleadoAsalariado EmpleadoPorComision EmpleadoPorHoras

EmpleadoBaseMasComision
Clases y métodos abstractos

Interfaces

• Cuando se tiene una clase abstracta en la cual no se implementa


ningún método, sino que únicamente se tienen las firmas, se trata de
una interfaz
• Los métodos de una interfaz no puede tener cuerpo!!!
• Se especifica que es una
public interface Figura1
interfaz
{
• A diferencia de las clases
public String obtenerNombre();
abstractas solo se colocan
public double obtenerArea();
las firmas de los métodos

}
Clases y métodos abstractos

Interfaces

• Las interfaces no se heredan, se implementan


• Se implementan los métodos cuyas firmas fueron definidas en la
interfaz
•Por defecto, los métodos de una interfaz son abstract, no es
necesario especificarlo
public class Circulo1 implements Figura1 Se utiliza la palabra
{ implements
private double radio;
public Circulo1(double r)
{
radio=r;
}
public double obtenerRadio()
{
return radio;
}
public double obtenerArea() Se implementa el método
{ obtenerArea
return Math.PI*radio*radio;

}
public String obtenerNombre() Se implementa el método
{ obtenerNombre
return "CIRCULO";
}
}
public class Cuadrado1 implements Figura1 Se utiliza la palabra
{ implements
private double lado;
public Cuadrado1(double l)
{
lado=l;
}
public double obtenerArea() Se implementa el método
{
obtenerArea
return lado*lado;

}
Se implementa el método
public String obtenerNombre()
obtenerNombre
{
return “CUADRADO";
}
}
Clases y métodos abstractos

Interfaces

• Una clase que implemente una interfaz, deberá implementar cada


uno de los métodos definidos en ella. De no hacerlo, se produce un
error de compilación
Clases y métodos abstractos

Interfaces

• Una clase puede implementar múltiples interfaces, para esto


separe por comas los nombres de las clases interfaces
public class Clase1 implements ClaseInterfaz1, ClaseInterfaz2
Clases y métodos abstractos

Interfaces

• En una interfaz se pueden declarar constantes, estas deben ser de


tipo final

public interface Constantes


{
public static final int UNO=1;
public static final int DOS=2;
public static final int TRES=3;
}
Clases y métodos abstractos

public interface Constantes


{
public static final int UNO=1;
public static final int DOS=2;
public static final int TRES=3;
}

Las clases que implementen la interfaz, pueden usar UNO, DOS,


TRES en cualquier parte de la clase. Aun sin utilizar la referencia
por medio de la instrucción Constantes.UNO

También podría gustarte