You are on page 1of 38

Programación Orientada a

Objetos
Lucio Marcelo Quispe Ortega
Contenido
● Paradigmas: Dos formas de Programar
○ Programación Estructurada
○ Programación Orientada a Objetos
● Clases y Objetos
● Modularización y Encapsulación
● Herencia
● Polimorfismo
● Abstracción
Contenido
● Paradigmas: Dos formas de Programar
○ Programación Estructurada
○ Programación Orientada a Objetos
● Clases y Objetos
● Modularización y Encapsulación
● Herencia
● Polimorfismo
● Abstracción
Paradigmas: Dos Formas de Programar

Paradigmas de
Programación

Programación Estructurada
Programación Orientada a
(orientada a
Objetos
procedimientos)
Contenido
● Paradigmas: Dos formas de Programar
○ Programación Estructurada
○ Programación Orientada a Objetos
● Clases y Objetos
● Modularización y Encapsulación
● Herencia
● Polimorfismo
● Abstracción
Programación Estructurada
● Dividir el programa en partes más
pequeñas (funciones, procedimientos,
subprogramas, subrutinas)
● Cada una de esas funciones tiene un
propósito
● La información se pasa entre funciones a
través de parámetros.
● Las funciones pueden tener datos locales a
los cuales no se pueden acceder fuera de
su ámbito.
● Utiliza el método descendente y las
funciones se invocan sucesivamente
● Lenguajes de programación: Fortran, Cobol,
Basic, C, Pascal.
Programación Estructurada
Problemas:

● El mantenimiento se hace más complicado


en programas grandes
○ function sum(a, b) => function sum(a, b, c)
● Las funciones comparten datos (variables
globales)
○ No se ocultan ni los nombres, tipos ni la
cantidad de los parámetros.
○ Tampoco se restringe el acceso a esos
datos para con funciones no deseadas.
○ Difícil de diseñar => no modelizan muy bien
el mundo real
○ Comunicación en el equipo de desarrollo:
cada programador tiene asignado funciones
independientes.
Programación Estructurada
Problemas:

● En aplicaciones complejas el código


resultaba difícil de descifrar
● Poco reutilizable
● Si existe fallo en alguna línea de código, es
probable que el programa falle.
● Aparición frecuente de código espagueti
(instrucciones goto)
● Difícil de depurar por otros programadores
en caso de necesidad o error.
Contenido
● Paradigmas: Dos formas de Programar
○ Programación Estructurada
○ Programación Orientada a Objetos
● Clases y Objetos
● Modularización y Encapsulación
● Herencia
● Polimorfismo
● Abstracción
Programación Orientada a Objetos
● Traslada la naturaleza de los objetos de la vida real al código de
programación
○ Los objetos tienen un estado, un comportamiento (¿Qué puede hacer?),
y unas propiedades. Por ejemplo, el objeto Automóvil:
■ ¿Cuál es su estado?: Parado, circulando, parqueado, etc.
■ ¿Qué propiedades tiene?: Color, capacidad, tracción, etc.
■ ¿Qué comportamiento tiene?: Arrancar, frenar, acelerar, girar, etc.
● Introduce los conceptos: Clase y Objeto
○ La clase es una plantilla o modelo que define las características, es decir
los datos (propiedades) y las funciones (métodos) que actúan sobre esos
datos y un objeto es una instancia de la clase. Por ejemplo:
■ Clase: empleado(documento, nombre, apellido, salario, departamento)
■ Objeto: empleado(1234567, “Juan Pérez”, 3500.00, “Sistemas”)
● Una clase se puede asemejar a un tipo de dato en un lenguaje de
programación estructurado y un objeto se puede asemejar a una
variable.
Programación Orientada a Objetos
● Algunos ejemplos de lenguajes: C++, Java, Python, C# entre otros.
● Ventajas:
○ Programas divididos en “partes”, “módulos” o “clases”: Modularización
○ Muy reutilizable: Herencia
○ Si existe un fallo en alguna línea de código, el programa continuará con
su funcionamiento. Tratamiento de Excepciones.
○ Que los objetos se comuniquen transparentemente con otros objetos
sin importar cómo funcionan los mismos. Encapsulamiento.
Programación Orientada a Objetos
● El Proceso de programación en un lenguaje orientado a objetos se
caracteriza por:

(1) Crear clases que definan la representación y comportamiento de


los objetos

(2) Crear objetos a partir de la definición de la clase.

(3) Realizar la comunicación entre objetos a través del envío de


mensajes (invocación a los métodos)
Programación Orientada a Objetos
1. Definir la clase Punto: 2. Crear un objeto con valores indefinidos de x e y:

class Punto { Punto punto1;


int abscisa;
int ordenada;
public: 3. Enviar el mensaje al objeto a través de un método:
void setCoordenadas (int x, int y) {
abscisa = a; punto1.setCoordenadas(80, 30);
ordenada = b;
}
int getAbscisa () {
return abscisa;
}
int getOrdenada() {
return ordenada;
}
};
Programación Orientada a Objetos
¿Qué cosas pueden ser objetos en POO?

● Elementos de entornos gráficos


○ Ventanas, menús, iconos, botones...
● Estructuras de datos
○ arrays, pilas, listas enlazadas, árboles, grafos...
● Datos matemáticos
○ ángulos, complejos, puntos en el plano, figuras…
● Objetos físicos
○ automóviles, aviones, casas…
● Y todo lo que uno puede imaginar...
Programación Orientada a Objetos
● Vocabulario de la POO
○ Clase
○ Objeto
○ Instancia de clase / Ejemplar de clase
○ Modularización
○ Encapsulamiento / encapsulación
○ Herencia
○ Polimorfismo
Contenido
● Paradigmas: Dos formas de Programar
○ Programación Estructurada
○ Programación Orientada a Objetos
● Clases y Objetos
● Modularización y Encapsulación
● Herencia
● Polimorfismo
● Abstracción
Clases y Objetos
● Clase
○ Modelo donde se redactan las características comunes de un grupo de objetos
Clases y Objetos
● Objeto
○ Ejemplar perteneciente a una clase. Cada objeto creado a partir de la clase se denomina instancia de la
clase.

Clase

Objetos
Clases y Objetos
● Objeto
○ Tiene propiedades (atributos)
■ Color
■ Capacidad
■ Tracción
■ Altura
■ Largo
○ Tiene un comportamiento
■ Arrancar
■ Frenar
■ Girar
■ Acelerar
Clases y Objetos
● Objeto
○ Accediendo a propiedades de objeto desde código (pseudocódigo)
■ Toyota.color = “Rojo”;
■ Toyota.capacidad = 4;
■ Toyota.tracción = “Delantera”;
■ Toyota.altura = 1000;
■ Toyota.largo = 2400;
○ Accediendo al comportamiento de objeto desde código (pseudocódigo):
■ Toyota.arranca();
■ Toyota.frena();
■ Toyota.gira();
■ Toyota.acelera();
Clases y Objetos
● Método Constructor
○ Es el método que especificará un estado inicial del objeto
○ En Java debe tener el mismo nombre, en Python lleva el nombre “__init__”. De acuerdo a ello puede
variar en otros lenguajes. El método Constructor puede recibir o no parámetros.

package poo; package poo;

public class Automovil { public class UsoAutomovil {


String Color;
int Capacidad; public static void main(String[] args) {
String Traccion; // Instanciamos la clase en los objetos
int Altura; Automovil autoToyota = new Automovil();
int Largo; Automovil autoSuzuki = new Automovil();

public Automovil() { autoToyota.Capacidad = 5;


Color = ""; System.out.println("La capacidad del auto es: " +
Capacidad = 0; autoToyota.Capacidad);
Traccion = "";
Altura = 0; // Ojo: nos saltamos la encapsulación!
Largo = 0;
} }
} }
Contenido
● Paradigmas: Dos formas de Programar
○ Programación Estructurada
○ Programación Orientada a Objetos
● Clases y Objetos
● Modularización y Encapsulación
● Herencia
● Polimorfismo
● Abstracción
Modularización y Encapsulación
● Modularización
○ Dividir un programa en uno/varios conjuntos de trozos (cuantas clases sean necesarias)
■ Ejemplo anterior: Clase Automovil y clase UsoAutomovil.
○ Debe existir siempre una clase principal que inicia la ejecución del programa con un método main.
○ Se puede colocar en un solo archivo varias clases pero no es lo conveniente.
■ Si fuera el caso debe existir una sola clase que sea pública con el mismo nombre del archivo.
○ Lo más conveniente es dividir la codificación en paquetes y clases.
Modularización y Encapsulación
● Encapsulación
○ Las propiedades de un objeto sólo deberían ser accedidas a través del mismo objeto y no directamente.
■ Ejemplo: No se podría dar movimiento a las llantas si no es a través del propio automóvil.
○ En el ejemplo anterior se nos permite acceder a la propiedad Capacidad directamente. Con eso estamos
cometiendo un error de violación de dato.
○ Por tanto todas las propiedades deben ser encapsuladas (no accesibles) y ser accedidas solo a través de
modificadores de acceso (métodos setters y getters).

package poo; package poo;

public class Automovil { public class UsoAutomovil {


... public static void main(String[] args) {
private int Capacidad; ...
... //Modificamos una de sus propiedades
public void setCapacidad(int capacidad) { autoToyota.setCapacidad(5);
this.Capacidad = capacidad
} System.out.println("La Capacidad del Automovil
public int getCapacidad() { es: " + autoToyota.getCapacidad());
return this.Capacidad; }
} }
}
Modularización y Encapsulación
● Uso de Constantes
○ Uso de final:
■ Los valores de las propiedades o atributos se pueden proteger aún más, haciendo que sólo se pueden
asignar una sola vez.
● Esta característica sólo podrá tener accesibles con métodos getters y no setters.

package poo;

public class Automovil {


...
private String Placa;
...
public Automovil(..., String placa) {
...
this.Placa = placa;
...
}
public String getPlaca() {
return this.Placa;
}
}
Modularización y Encapsulación
● Uso de Constantes
○ Uso de static:
■ Las propiedades estáticas de una Clase son compartidas por todos los Objetos que heredan de ella, con lo
que si su valor es modificado en cualquier de ellos afectará a todas las demás instancias.
■ Los métodos estáticos sólo actúan sobre la clase y no sobre los objetos.
■ Además los métodos estáticos sólo pueden acceder a propiedades estáticas.

package poo;

public class Automovil { ...


... System.out.println(“Cantidad de instancias: ” +
private static int Num = 0; Automovil.getTotalInstancias());
... ...
public Automovil(..., String placa) {
...
Num++;
...
}
public static int getTotalInstancias() {
return Num;
}
}
Modularización y Encapsulación
● Uso de Constantes
○ Uso de static final:
■ Las propiedades estáticas y finales a la vez, son constantes donde el valor que contienen no se puede
modificar y que puede ser accedida directamente desde la clase.

//public static final double PI;

public static final double pi = Math.PI;


Modularización y Encapsulación
● Sobrecarga de Constructores
○ Son las declaraciones repetidas del método Constructor pero con distinta cantidad de parámetros o
distintos tipos de parámetros.

package poo;
public class Empleado {
...
public Empleado(String nombre, double sueldo, int edad) {
this.Nombre = nombre; ...
this.Sueldo = sueldo; Empleado empleado1 = new Empleado(“Juan
this.edad = edad; Pérez”);
} Empleado empleado2 = new Empleado(“Jose
public Empleado(String nombre, double sueldo) { Cors”, 3500);
this.Nombre = nombre; ...
this.Sueldo = sueldo;
this.edad = 0;
}
public Empleado(String nombre) {
this(nombre, 0, 0);
}
}
Modularización y Encapsulación
● Sobrecarga de Métodos
○ Son las declaraciones repetidas de los método pero con distinta cantidad de parámetros o distintos
tipos de parámetros.

...
package poo;
Empleado empleado = new Empleado(“Juan Pérez”,
public class Empleado {
3500);
...
System.out.println(“Liquido Pagable: ” +
public double getLiquidoPagable() {
empleado.getLiquidoPagable());
return this.Sueldo - this.getTotalDescuentos();
}
//O también
public double getLiquidoPagable(double sueldo) {
Empleado empleado = new Empleado(“Juan Pérez”);
return sueldo - this.getTotalDescuentos();
System.out.println(“Liquido Pagable: ” +
}
empleado.getLiquidoPagable(3500));
}
...
Contenido
● Paradigmas: Dos formas de Programar
○ Programación Estructurada
○ Programación Orientada a Objetos
● Clases y Objetos
● Modularización y Encapsulación
● Herencia
● Polimorfismo
● Abstracción
Herencia
● Es la propiedad que permite que
las clases sean creadas a partir
de otras ya existentes,
obteniendo características
(métodos y atributos) similares a
las ya existentes.
● No es nada más que la
reutilización de código.
● Nos permite especializar cada
una de las clases heredadas.
Herencia
public class Taxi extends Vehiculo {
private int NumeroLicencia;

public Taxi(int numeroLicencia) {


super(); //llama al const. de la clase padre
this.NumeroLicencia = numeroLicencia;
}
public class Vehiculo { public int getNumeroLicencia() {
private String Matricula; return this.Matricula;
private String Modelo; }
private int PotenciaCV; public void setNumeroLicencia(int numeroLicencia) {
this.NumeroLicencia = numeroLicencia;
public Vehiculo () { }
this.Matricula = “”; }
this.Modelo = “”;
this.PotenciaCV = 0;
}
public String getMatricula() { public class Autobus extends Vehiculo {
return this.Matricula; private int NumeroPlazas;
}
public String getModelo() { ...
return this.Modelo; public Autobus(String matricula, String modelo, int
} potenciaCV, int numeroPlazas) {
public int getPotenciaCV() { super(Matricula, modelo, potenciaCV); //llama
return this.PotenciaCV; al const. de la clase padre
} this.NumeroPlazas = numeroPlazas;
} }
...
}
Contenido
● Paradigmas: Dos formas de Programar
○ Programación Estructurada
○ Programación Orientada a Objetos
● Clases y Objetos
● Modularización y Encapsulación
● Herencia
● Polimorfismo
● Abstracción
Polimorfismo
● Principio de sustitución: Se puede utilizar un objeto de la subclase siempre que el programa
espere un objeto de la superclase.
● O lo que es lo mismo: Un objeto se puede comportar de diferente forma dependiendo del
contexto (enlazado dinámico). Las variables objeto son polimórficas.

//Principio de Sustitución //Comportamiento polimórfico


... ...
Vehiculo[] misVehiculos = new Vehiculo[3]; for (Vehiculo v: misVehiculos) {
misVehiculos[0] = new Vehiculo(); System.out.println(“El impuesto es: “ +
misVehiculos[1] = new Vehiculo(); v.getImpuesto());
misVehiculos[2] = new Taxi(); }
... ...

//Solo en el caso del 3er elemento ejecutará la


función getImpuesto() de Taxi y no de vehículo.
Contenido
● Paradigmas: Dos formas de Programar
○ Programación Estructurada
○ Programación Orientada a Objetos
● Clases y Objetos
● Modularización y Encapsulación
● Herencia
● Polimorfismo
● Abstracción
Abstracción
● Se plantea en términos de similitudes entre fenómenos, conceptos y entidades.
○ De esta manera logramos identificar conceptos generales.
● Una clase abstracta al final significa un patrón de diseño para las clases.
○ Cuando se define uno o más métodos abstractos la clase deberá ser también abstracta (JAVA).
○ Las clases que heredan de una clase abstracta están obligadas a reescribir los métodos abstractos.
class Persona {
private double Sueldo;
abstract class Persona {
public Persona(String nombre, double sueldo){
private String Nombre;
super(nombre);
public Persona(String nombre){
this.Sueldo = sueldo;
this.Nombre = nombre;
}
}
public double getSueldo() {
public String getNombre() {
return this.Sueldo;
return this.Nombre;
}
}
public void setSueldo(double sueldo) {
public void setNombre(String nombre) {
this.Nombre = nombre;
this.Nombre = nombre;
}
}
public String getDescripcion(){
public abstract String getDescripcion();
return “Este empleado ...”;
}
}
}
Características de una Clase Abstracta
Esto es lo que debemos conocer sobre de Clases Abstractas.

● Una clase Abstracta No puede ser instanciada (no se pueden crear objetos directamente -
new(), solo puede ser heredada.

● Si al menos un método de la clase es abstract, esto obliga a que la clase completa sea definida
abstract, sin embargo la clase puede tener el resto de métodos no abstractos.

● Los métodos abstract no llevan cuerpo (no llevan los caracteres {}).

● La primer subclase concreta que herede de una clase abstract debe implementar todos los
métodos de la superclase.
Especificadores o Modificadores de Acceso