Estructura de Datos POO
Programación Orientada a Objetos.
Contenido:
• Introducción a la Programación Orientada a Objetos (POO)
• Que es la programación OO.
• Relación entre la ED y la POO.
• Conceptos Básicos de la POO.
• Creación de un proyecto de consola en C++.
• Creación de una clase en Visual Studio.
• Ver proyecto empleados y utilizarlo en su práctica.
Objetivo.
Crear una aplicación consola utilizando la POO, C++ y visual studio.
Introducción.
La Programación Orientada a Objetos (POO) no es un lenguaje de programación, puede aplicarse a
cualquier lenguaje, y de hecho hoy en día está disponible en mayor o menor medida en todos los
lenguajes tradicionales, por ejemplo, C se ha convertido en C++, Pascal en Delphi, Visual Studio
incorpora la POO y ya no aparece un lenguaje nuevo sin que no incluya la POO.
El primer avance en metodología de la programación, vino con la Programación Estructurada, junto
con ella aparece un concepto que nos permite abarcar programas más amplios con menor esfuerzo:
el de función. Simultáneamente al concepto de función aparece el de variables de ámbito reducido.
Las funciones podemos verlas como cajas negras, que reciben y devuelven valores. Solo se tienen
que programar una vez, pueden ser probadas por separado y comprobar que funcionan
correctamente, una vez terminadas se pueden utilizar las veces que se quiera.
La POO, nos ofrece mucho mayor dominio sobre el programa. Hasta este momento el programador
tenía que controlar y mantener en su mente cada proceso que realizaba. Ahora podrá realizar
aplicaciones mucho más complejas ya que se exige menos esfuerzo de atención, los objetos no
mezclan sus datos con otros métodos distintos a los suyos. Otro aspecto para considerar es que se
hace más fácil la reusabilidad del código escrito y la portabilidad.
1
Estructura de Datos POO
Que es la POO.
El Mundo que nos rodea, es una colección de objetos que se relacionan entre sí.
El lenguaje natural está dotado de palabras, sustantivos, para nombrarlos y verbos para describir las
operaciones o acciones que ellos desarrollan.
Es una técnica de estructuración, donde los objetos son los principales Elementos de Construcción
que se conectan entre sí.
Es una Metodología de Programación de Propósito General que simula la forma en que el hombre
trabaja.
Es una evolución natural de la programación. Un programa OO debe verse como un conjunto de
Objetos en Comunicación.
Relación entre la POO y ED.
La clave de la programación OO es encontrar características comunes entre entidades implicadas en
el problema y crear estructuras de datos (objetos) que capturen esas características comunes. Una
vez identificados los objetos del problema, se definen sus características y se puede modelar su
comportamiento.
Conceptos Básicos de la Programación Orientada a Objetos
• Abstracción.
• Clase.
• Objeto
• Atributos:
• Métodos.
• Encapsulamiento.
• Instanciación.
• Polimorfismo.
• Relaciones
• Herencia
• Pertenencia
• Utilización
Para la descripción de los elementos de la POO, utilizaremos el siguiente ejemplo:
2
Estructura de Datos POO
• Se quiere crear un programa para la manipulación de los recursos humanos de una
Universidad, y se conoce la información de sus empleados Nombres, Apellidos, edad, Fecha
de Ingreso, Categoría (contrato, fijo) y salario.
• Para comenzar veremos entonces la interfaz tentativa para resolver y representar la
situación anterior:
• A continuación, estudiamos y ejemplificamos los conceptos de la programación OO.
Abstracción.
Es aquella característica que nos permite identificar un objeto a través de sus aspectos
conceptuales. Las características de los objetos pueden ser tan diferentes que puede costarnos
reconocer que pertenecen a una misma clase, sin embargo, nosotros reconocemos a que clase
pertenecen, gracias a la Abstracción.
Ejemplos:
3
Estructura de Datos POO
Se tiene un auto deportivo y otro familiar, ambos son autos, pues ambos tienen rueda, volante,
motor, puertas, etc.
Para el caso de estudio planteado, se tiene empleados administrativos y docentes, pero ambos,
gracias a la abstracción podemos decir que son Empleados
Un objeto Empleado para gestionar el personal de la universidad, aunque se tengan diferentes
tipos de empleados.
Clase.
Es el conjunto de especificaciones o normas que definen como va a ser creado un objeto de un
tipo determinado, algo parecido a un manual de instrucciones conteniendo indicaciones para
crear el objeto.
Una clase constituye la representación abstracta de algo, mientras que un objeto constituye la
representación concreta de lo que una clase define.
Determina el conjunto de puntos calves que ha de cumplir un objeto para ser considerado
perteneciente a dicha clase o categoría, pues dos objetos de una misma clase no tienen que ser
iguales, basta que cumplan las especificaciones de la clase.
Para el ejemplo planteado, se tiene la clase Empleado. En visual studio puede crear una clase a
través de las opciones Proyecto - Agregar clase. La clase se definiría en C++ de la siguiente
forma:
Ejemplo:
class empleado
{
//Código de la clase empleado
Objeto.
Es la Unidad Básica de la Programación Orientada a Objetos.
4
Estructura de Datos POO
Es una pieza que se ocupa de desempeñar un trabajo concreto dentro de una estructura
organizativa de varios objetos, cada uno de los cuales ejerce la tarea particular para la que fue
diseñada.
Es una agrupación de código, compuesta de propiedades y métodos que pueden ser
manipulados como una unidad independiente.
Un objeto es un ejemplar de una clase.
Definición de un objeto en C:
empleado emp1; // Se define un objeto llamado emp1, de tipo empleado
Atributos Pasivos o Campos.
Definen los Datos del objeto permitiendo consultar o modificar su estado, en cualquier
momento de acuerdo con el procesamiento que se esté realizando.
Pueden ser de cualquier tipo, incluyendo al tipo class, o sea, que un campo de un objeto puede
ser un objeto de otra clase.
La declaración se realiza especificando un identificador anteponiendo el tipo de datos.
Se les puede llamar también campos.
Ejemplo:
class Empleado
{
……
string CI, Nombres, Apellidos;
string Dirección;
float Salario;
Date Fecha ;
……..
}
Métodos o Atributos activos
1.- Son las Rutinas que definen el comportamiento de la clase
2.-Se declaran a continuación de los campos.
3.- Se pueden tener los siguientes métodos:
• Constructores
5
Estructura de Datos POO
• Destructores
• Procedimientos y Funciones.
Constructores
✓ Solicitan y reservan espacio en memoria.
✓ Sirven para inicializar un objeto de una determinada clase al mismo tiempo que
se declara.
✓ Tienen el mismo nombre que la clase a la que pertenecen.
✓ Colocan un puntero a la zona de memoria donde están los métodos de la clase a
la que corresponde el objeto, de manera que los mensajes que este reciba
puedan ser atendidos adecuadamente.
✓ No tienen tipo de retorno, y por lo tanto no retornan ningún valor.
✓ Deben ser públicos, ya que siempre se usan desde el exterior de la clase.
✓ Pueden definirse varios constructores para una misma clase, pero no deben
tener el mismo número de argumentos.
✓ Si no usa parámetros, se utiliza para inicializar los valores por defecto que
tendrán los atributos.
✓ Si tiene parámetros permite asignar valores a los atributos, a la vez que se
define el objeto.
Por ejemplo:
class empleado
{
string CI, Nombres, Apellidos, sexo ;
int edad;
float Salario;
Date Fecha;
….
empleado (); //Constructor, tiene el mismo nombre que la clase
….
}
6
Estructura de Datos POO
empleado::empleado() {
ci = "";
nombre = "";
apellido = "";
edad = 0;
sexo = "masculino";
categoria = contrato;
salario=500;
fecha_ingreso.Day=1;
fecha_ingreso.Month = 01;
fecha_ingreso.Year = 1900;
}
Destructores
✓ Los destructores se utilizan para eliminar un objeto.
✓ Libera la memoria que estaba siendo utilizada por el objeto.
✓ Tienen el mismo nombre que la clase a la que pertenecen, pero con el símbolo ˜
delante. Carácter virgulilla (~), es el signo que se encuentra encima de la ñ, se le
llama también la tilde de la ñ, cuyo código ascii es 126.
✓ No tienen parámetros.
✓ No retornan ningún valor
✓ Deben ser públicos.
Ejemplo:
class empleado
{
private:
string ci, nombre;
string apellido;
int edad;
string sexo;
categorias_posibles categoria;
float salario;
Fecha fecha_ingreso;
public:
//metodos constructores y destructores
empleado();
~empleado(); //destructor de la clase empleado
//otros métodos
7
Estructura de Datos POO
Procedimientos y Funciones
Se declaran especificado el tipo que devuelve y el nombre del procedimiento o función,
seguido de la lista de parámetros entre paréntesis, separados por coma, y especificando
el tipo de cada uno de los parámetros.
Por Ejemplo:
o Supongamos que se quiere manipular la información de tal manera que se
pueda subir la categoría de un profesor a su inmediata superior, y además que
en aquellos casos en que no se exceda el salario máximo que es de 15000, esta
operación implica el aumento de 300 pesos al mismo, cuyo monto mínimo es
de 500.
class empleado
{
……
string ci, nombres, apellidos ;
string dirección;
float salario;
Date fecha;
string categoría;
empleado()
{
….
}
void subircategoria();
void empleado::subircategoria() {
if (categoria != fijo) {
categoria = fijo;
if (salario + 1000 > 15000) {
salario = 15000;
}
else
salario = salario + 1000;
}
}
8
Estructura de Datos POO
Encapsulamiento.
Establece la separación entre el interfaz del objeto y su implementación.
Por Ejemplo:
Auto: Cuando se acelera, uno se limita a sólo eso, no se requiere saber la mecánica interna que
hace que el auto se mueva más rápido o no.
En un sistema de gestión donde se necesite añadir un empleado, solamente se invoca al método
añadir y él se encargará de hacer ese trabajo, no se necesita saber el código del método añadir.
Ventajas del encapsulamiento:
• Permite ignorar detalles de almacenamiento: A envía un mensaje a B y para ello no
necesita conocer los datos de B, ni como se almacenan estos.
• Simplifica el programa. Cada objeto puede ser modificado sin afectar los módulos que
lo acceden. Garantiza la integridad de los datos: el acceso a la información almacenada
en un objeto, o sea, la recuperación, inicialización, actualización o modificación de
dicha información, debe realizarse siempre a través de los métodos definidos en la clase
a la que pertenece dicho objeto.
• Proporciona seguridad al código de la clase.
• Simplifica la utilización de los objetos. Ya que un programador que use un objeto, no
necesitará conocer los detalles de su implementación, se limitará a utilizarlo.
Visibilidad de los Atributos.
• Cada atributo tiene una característica llamada visibilidad.
• La misma establece el acceso al mismo.
• La visibilidad indica cuáles atributos pueden ser manipulados desde el exterior del
objeto, y quiénes pueden hacerlo.
• Se utilizan las palabras reservadas:
✓ private
✓ public
✓ protected
• Cada una de las cuales representa un nivel de acceso al atributo.
• A continuación, se explican las características de los elementos públicos, privados y
protegidos.
9
Estructura de Datos POO
Atributos Privados (private).
• Un atributo privado no puede ser accedido desde fuera de la clase a la que pertenece.
• Es de uso privado de esa clase.
• Deben declararse como privados todos los atributos pasivos de una clase, como una
forma de no violar el encapsulamiento.
• Ejemplo:
class empleado
{
private:
string ci, nombre;
string apellido;
int edad;
string sexo;
categorias_posibles categoria;
float salario;
Fecha fecha_ingreso;
……
Atributos Públicos (public)
• Un atributo público puede ser accedido desde cualquier clase o desde cualquier módulo
donde la clase a la que pertenece pueda ser referenciada.
• Cuando un atributo no tiene especificado un nivel de visibilidad, se asume que tiene la
misma visibilidad del atributo que le precede en la declaración de la clase.
• Dentro de cada nivel de visibilidad especificado en una clase, deben declararse siempre
primero los atributos pasivos y luego los activos.
• Para mayor claridad en el código que se escribe, lo mejor es colocar todos los elementos
privados juntos, seguidos de todos los protegidos y así, sucesivamente.
class empleado
{
private:
string ci, nombre;
string apellido;
int edad;
string sexo;
10
Estructura de Datos POO
categorias_posibles categoria;
float salario;
Fecha fecha_ingreso;
public:
//metodos constructores y destructores
empleado();
~empleado();
//otros métodos
void subircategoria();
}
Métodos get y set.
Permiten el acceso (lectura y escritura) a los campos de la clase, de manera que estos
puedan ser siempre manipulados a través de ella. Ayudan a mantener el encapsulamiento.
✓ La función getnombreatributo para leer el valor del atributo
✓ El procedimiento setnombreatributo para escribir un valor en ese atributo.
Ejemplo:
class empleado
{
private:
string ci, nombre;
string apellido;
int edad;
string sexo;
categorias_posibles categoria;
float salario;
Fecha fecha_ingreso;
public:
//metodos constructores y destructores
TEmpleado();
~TEmpleado();
//metodos accesores get y set
string getci() { return ci; }
string getnombre() { return nombre; }
string getapellido() { return apellido; }
int getedad() { return edad; }
string getsexo() { return sexo; }
float getsalario() { return salario; }
float getsalario(int _salario) { salario = _salario; }
categorias_posibles getcategoria() { return categoria; }
Fecha getfechaingreso() { return fecha_ingreso; }
void setci(string _ci) { ci = _ci; }
void setnombre(string _nombre) { nombre = _nombre; }
void setapellido(string _apellido) { apellido = _apellido; }
11
Estructura de Datos POO
void setedad(int _edad) { edad = _edad; }
void setsexo(string _sexo) { sexo = _sexo; }
void setsalario(int _salario) { salario = _salario; }
void setcategoria(categorias_posibles _categoria) { categoria = _categoria; }
void setfechaingreso(Fecha _fechaingreso) { fecha_ingreso = _fechaingreso; }
// Metodos varios
void subircategoria();
};
Instanciación.
• Es el hecho de crear un objeto como tal, con características propias.
Relaciones entre Objetos.
• Herencia.
• Pertenencia.
• Utilización.
Herencia:
• Mecanismo a través del cual se pueden construir clases en función de otras clases ya
definidas.
• Establece que partiendo de una clase a la que denominamos clase base, padre o
superclase, creamos una nueva clase denominada clase derivada, hija o subclase.
• En esta clase derivada disponemos de todo el código de la clase base, mas el nuevo
código propio de la clase hija que escribamos para extender sus funcionalidades.
• A su vez podemos tomar una clase derivada y crear nuevas subclases a partir de ellas y
así sucesivamente, componiendo lo que se denomina jerarquía de clases.
• En los lenguajes OO la herencia de atributos se extiende tanto a los datos o campos,
como al comportamiento, o sea, los métodos.
• Se puede identificar a través del uso de la partícula Es-un.
• Por ejemplo, sean los objetos A y B si tiene sentido el enunciado “A es un B” se puede
diseñar la clase A como una subclase de B.
• Ejemplo:
Supongamos la siguiente situación:
Se tiene Clase Base empleado, pero surge la necesidad de realizar pago a empleados que
no trabajan en la empresa, pues son comerciales que se pasan la mayor parte del tiempo
12
Estructura de Datos POO
desplazándose, y para realizar esto, utilizamos Internet, necesitando el número de
tarjeta de crédito, la dirección de email, etc.
Esto se puede resolver creando la clase derivada ciberempleado que heredará de la clase
empleado y en la que solo se debe añadir las nuevas propiedades y métodos para las
transacciones comerciales, ya que las demás operaciones se tienen en la clase empleado
de la cual ella hereda.
Quedando la interfaz para trabajar con este problema de la siguiente manera:
13
Estructura de Datos POO
class ciberEmpleado: public empleado
{
private:
string tarjeta;
public:
//Metodos constructor y destructor
ciberEmpleado();
~ciberEmpleado();
//otros metodos
string gettarjeta() { return tarjeta; }
void settarjeta(string _tarjeta) { tarjeta = _tarjeta; }
};
//Implementación de los métodos
TCiberEmpleado::TCiberEmpleado():TEmpleado() {
tarjeta = "";
}
TCiberEmpleado::~TCiberEmpleado(){}
Pertenencia:
Los objetos pueden estar formados a su vez por otros objetos.
Se dice en este caso que hay una relación de pertenencia puesto que existe un conjunto de
objetos que pertenecen a otro objeto o se unen para formar otro objeto.
A este tipo de relación se le llama también contenedora.
Para reconocer esta relación entre objetos se puede realizar un análisis sintáctico sobre la
misma usando la partícula (tiene - un).
Tiene-un también se puede expresar con Es-parte-de que se da también cuando alguno de
los conceptos es un componente del otro, pero cuando los dos no son en sentido alguno, la
misma cosa.
Tomando la interfaz vista anteriormente, podemos crear una nueva. Adicionando los
controles necesarios para poder introducir la información referente a la dirección del
empleado, ya sea este ciberEmpleado o no.
14
Estructura de Datos POO
Ejemplo:
La interfaz para trabajar con este problema puede quedar de la siguiente manera:
En este caso, se puede considerar que dirección es parte de la clase. Dirección puede ser
definida como una clase. Por lo tanto, habrá que implementar la clase dirección. Y en la
clase empleado declararse un atributo dirección_empleado de tipo dirección.
class direccion
protected:
string calle, ciudad;
int numero;
public:
//metodos constructores y destructores
direccion();
direccion(string _calle, string _ciudad, int _numero);
~direccion();
15
Estructura de Datos POO
//metodos accesores get y set
string getcalle() { return calle; }
string getciudad() { return ciudad; }
int getnumero() { return numero; }
};
.cpp
#include "direccion.h"
direccion::direccion() {
calle = "";
ciudad = "";
numero=0;
direccion::direccion(string _calle, string _ciudad, int _numero) {
calle = _calle;
ciudad = _ciudad;
numero = _numero;
}
direccion:: ~direccion() {
class empleado
{
protected:
string ci, nombre;
string apellido;
int edad;
string sexo;
categorias_posibles categoria;
float salario;
Fecha fecha_ingreso;
direccion direc;
public:
//metodos constructores y destructores
empleado();
empleado(string ci, string nombre, string apellido, int edad,
string sexo, categorias_posibles categoria, float salario, Fecha
fecha_ingreso);
~empleado();
//metodos accesores get y set
string getci() { return ci; }
string getnombre() { return nombre; }
string getapellido() { return apellido; }
int getedad() { return edad; }
16
Estructura de Datos POO
string getsexo() { return sexo; }
float getsalario() { return salario; }
float getsalario(float _salario) { salario = _salario; }
categorias_posibles getcategoria() { return categoria; }
Fecha getfechaingreso() { return fecha_ingreso; }
direccion getdireccion() { return direc; }
void setci(string _ci) { ci = _ci; }
void setnombre(string _nombre) { nombre = _nombre; }
void setapellido(string _apellido) { apellido = _apellido; }
void setedad(int _edad) { edad = _edad; }
void setsexo(string _sexo) { sexo = _sexo; }
void setsalario(float _salario) { salario = _salario; }
void setcategoria(categorias_posibles _categoria) { categoria =
categoria; }
void setfechaingreso(Fecha _fechaingreso) { fecha_ingreso =
_fechaingreso; }
void setdirec(direccion _direc) { direc = _direc; }
// Metodos varios
void subircategoria();
};
Utilización:
• Hay situaciones en que un objeto utiliza a otro para realizar una determinada tarea, sin
que ello suponga la existencia de una relación de pertenencia entre dichos objetos.
• Para saber si existe esta relación debemos realizar un análisis sintáctico sobre el misma
empleando la partícula “usa un”
• El código de una clase hace uso (utiliza) un objeto de otra clase.
• Por ejemplo
• “Un objeto ventana usa un objeto empleado”, devolvería verdadero.
Polimorfismo
• La palabra polimorfismo se deriva del griego poli: muchos y morfismo: forma,
modalidad.
• Determina que el mismo nombre de método, realizará diferentes acciones según el
objeto sobre el que sea aplicado.
• Ejemplo real:
17
Estructura de Datos POO
Pelota y Vaso de Cristal: Si ejecutamos sobre ellos el método dejar caer, el resultado en
ambos casos será diferente, mientras que el objeto pelota rebotará al llegar al suelo, el
vaso cristal se romperá.
• Ejemplo de programación: Supongamos los objetos Ventana y Fichero, si ejecutamos
sobre ambos el método abrir el resultado en ventana será la visualización de una
ventana en el monitor, mientras que fichero se tomará un fichero en el equipo del
usuario y se dejará listo para realizar sobre él, operaciones de lectura o escritura.
• Ventajas del Polimorfismo: Permite generar componentes reutilizables de alto nivel que
pueden adaptarse para que se ajusten a diferentes aplicaciones mediante el cambio de
sus partes de bajo nivel.
• Se define el método de la clase padre como virtual y el método en la clase hija como
override, es decir, va a ser reescrito.
18