Вы находитесь на странице: 1из 12

Profesor: Integrantes:

Juan Hernandez Pedro Mendoza 21.513.219

Carlos Guedez 24.487.455

José Marcano 24.578.749

El Tigre, Agosto de 2018


Introducción

Es importante aclarar desde un principio la diferencia que existe entre programación


orientada a objetos y un lenguaje orientado a objetos.

La programación orientada a objetos es una “filosofía”, un modelo de programación, con su


teoría y su metodología, que conviene conocer y estudiar antes de nada. Un lenguaje
orientado a objetos es un lenguaje de programación que permite el diseño de aplicaciones
orientadas a objetos. Dicho esto, lo normal es que toda persona que vaya a desarrollar
aplicaciones orientadas a objetos aprenda primero la “filosofía” (o adquiera la forma de
pensar) y después el lenguaje, porque “filosofía” sólo hay una y lenguajes muchos. En este
documento veremos brevemente los conceptos básicos de la programación orientada a
objetos desde un punto de vista global, sin particularizar para ningún lenguaje de
programación específico.
Programación Orientada a Objetos:
 Historia:

Podemos considerar como inicio del paradigma de Programación Orientada a Objetos


(Object Oriented Programming) el lenguaje de programación Simula desarrollado por Kristen
Nygaard y Ole-Johan Dahl en la mitad de los años 60 en el Centro de Computación Noruego
(The Norwegian Computing Center). Simula se definió como un lenguaje de programación
orientado a la simulación de procesos, con el que se podían definir distintos tipos de
actividades. En este lenguaje aparecen por primera vez los conceptos de clases y objetos.

 Propiedades:

 Abstracción: Representación de las características fundamentales de algo sin


incluir antecedentes o detalles irrelevantes.

Características
– Es uno de los métodos fundamentales para enfrentarse a la complejidad inherente al software (ya
visto en los TADs).

– La OO fomenta que el uso de abstracciones en los datos y procedimientos para simplificar la


descripción del problema

– El elemento clave de la abstracción es la clase.

Hay una alta gama de abstracciones que existen desde los objetos que modelan muy cerca
de entidades, a objetos que no tienen razón para existir.

Abstracción de entidades: Es un objeto que representa un modelo útil de una entidad que
se desea.

Abstracción de acciones: Un objeto que representa un conjunto de operaciones y todas ellas


desempeñan funciones del mismo tipo.

Abstracción de máquinas virtuales: Un objeto que agrupa operaciones, todas ellas virtuales,
utilizadas por algún nivel superior de control u operaciones.

Abstracción de coincidencia: Un objeto que almacena un conjunto de operaciones que no


tienen relación entre sí.

 Encapsulamiento: Proceso de almacenar en un mismo compartimiento los


elementos de una abstracción que constituyen su estructura y su
comportamiento.
Características

- La abstracción se centra en el comportamiento observable de un


objeto, por el contrario el encapsulamiento se centra en la
implementación que da lugar a ese comportamiento.
- El encapsulamiento también implica ocultación de información.
- Cada objeto revela lo menos posible de su estructura interna
- parte pública ⇒ interfaz, parte privada ⇒ implementación.

Niveles de encapsulamiento:

1. Estándar: (Predeterminado).
2. Abierto: Hace que el miembro de la clase pueda ser accedido desde el exterior de la
clase y cualquier parte del programa.
3. Protegido: Solo es accesible desde la clase y las clases que heredan (a cualquier
nivel).
4. Semi Cerrado: Solo es accesible desde la clase heredada.
5. Cerrado: Solo es accesible desde la clase.

Ventajas:

- La supresión de los detalles de bajo nivel nos permite razonar acerca de la


operación u objeto de forma más eficiente.
- Un cambio en la representación de una abstracción puede no obligar a un
cambio en los clientes que la utilicen.
- Cambios en el diseño que no afecten al interfaz no se propagan.
- Podemos cambiar una función por otra más eficiente sin afectar a los usuarios
de dicha función.
- Muy importante ya que facilita el mantenimiento del software

- Java
• La encapsulación se consigue a través del concepto de clase combinado
con los especificadores de acceso que limitan la visibilidad de los atributos y
métodos.

Ejemplos

- Una operación es vista por sus usuarios como si fuera una simple entidad,
aunque está formada por una secuencia de operaciones a bajo nivel.
- Un objeto es visto como un simple objeto en vez de como una composición
de sus partes individuales.
 Polimorfismo: Es la habilidad que poseen los objetos para reaccionar de modo
diferente ante los mismos mensajes.

Beneficios:

- Simplicidad
 Si se necesita escribir código que trata con una familia de subtipos, el código puede
ignorar los detalles específicos de tipo y solo interactuar con el tipo base de la familia.
 Aun cuando el código piense que está usando un objeto de la clase base, la clase
del objeto podría ser la clase base o cualquiera de sus subclases.

- Extensibilidad:
 Se pueden añadir subclases posteriormente a la familia de tipos, y los objetos de
estas nuevas subclases, podría trabajar con el código existente.

Tipos de Polimorfismos:

Polimorfismo de sobrecarga: Ocurre cuando las funciones del mismo nombre existen, con
funcionalidad similar, en clases que son completamente independientes una de otra (éstas
no tienen que ser clases secundarias de la clase objeto). Por ejemplo, la clase complex,
la clase image y la clase link pueden todas tener la función "display". Esto significa que no
necesitamos preocuparnos sobre el tipo de objeto con el que estamos trabajando si todo lo
que deseamos es verlo en la pantalla.

Por lo tanto, el polimorfismo de sobrecarga nos permite definir operadores cuyos


comportamientos varían de acuerdo a los parámetros que se les aplican. Así es posible, por
ejemplo, agregar el operador + y hacer que se comporte de manera distinta cuando está
haciendo referencia a una operación entre dos números enteros (suma) o bien cuando se
encuentra entre dos cadenas de caracteres (concatenación).

Polimorfismo paramétrico: es la capacidad para definir varias funciones utilizando el mismo


nombre, pero usando parámetros diferentes (nombre y/o tipo). El polimorfismo paramétrico
selecciona automáticamente el método correcto a aplicar en función del tipo de datos
pasados en el parámetro.

Por lo tanto, podemos por ejemplo, definir varios métodos homónimos de addition()
efectuando una suma de valores.

 El método int addition (int,int) devolvería la suma de dos números enteros.


 El método float addition (float, float) devolvería la suma de dos flotantes.
 El método char addition (char, char) daría por resultado la suma de dos caracteres
definidos por el autor.

Una signature es el nombre y tipo (estático) que se da a los argumentos de una función.
Por esto, una firma de método determina qué elemento se va a llamar.
Polimorfismo de inclusión: Es la habilidad para redefinir un método en clases que
se hereda de una clase base se llama especialización. Por lo tanto, se puede llamar un
método de objeto sin tener que conocer su tipo intrínseco: esto es polimorfismo de
subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una familia
de objetos, enmascarándolos con una interfaz común (siendo esta la clase básica).

Ejemplo de Polimorfismo

En este ejemplo haremos uso del lenguaje C++ para mostrar el polimorfismo. También se
hará uso de las funciones virtuales puras de este lenguaje, aunque para que el polimorfismo
funcione no es necesario que las funciones sean virtuales puras, es decir, perfectamente el
código de la clase "superior" (en nuestro caso Empleado) podría tener código.
#include<stdio.h>;

#include<conio.h>;

#include<iostream>;

using namespace std;

class figuras {

public:

float base;

float altura;

public:

float captura();

virtual unsigned float perimetro()=0;

virtual unsigned float area()=0;

};

class rectangulo: public figura{

public:

void imprime();

unsigned float perimetro(){return 2*(base+altura);}


unsigned float area(){return base*altura;}

};

class triangulo: public figura{

public:

void muestra();

unsigned float perimetro(){2*altura+base}

unsigned float area(){return (base*altura)/2;}

};

void figura::captura(){

cout<<"CALCULO DEL AREA Y PERIMETRO DE UN TRIANGULO ISOCELES Y UN RECTANGULO:"


<<endl;

cout<<"escribe la altura: ";

cin>>altura;

cout>>"escribe la base: ";

cin>>base;

};

 Herencia:

La herencia es una propiedad fundamental de la programación orientada a objetos que


permite a los objetos ser construidos a partir de otros objetos, es la capacidad que tienen
los objetos de utilizar métodos y atributos de antepasados o ascendientes con el objetivo
de reutilizar software; con la herencia se pueden definir clases nuevas a partir de clases
existentes mediante la absorción de sus atributos y funciones mejorándolos con los
requerimientos de las nuevas clases.

La herencia expresa en general una especialización o una generalización de una clase sobre
la otra.

Beneficios:

 Reusabilidad del Software.


 Compartir código.
 Consistencia de la interfaz.
 Componentes del software.
 Modelado rápido de prototipos.
 Polimorfismo.
 Ocultamente de información.

Tipos de herencia:

Hay dos tipos de herencia: Herencia Simple y Herencia Múltiple. La primera indica que se
pueden definir nuevas clases solamente a partir de una clase inicial mientras que la segunda
indica que se pueden definir nuevas clases a partir de dos o más clases iniciales. Java sólo
permite herencia simple.

Herencia simple: Herencia Simple La herencia en C++ es un mecanismo de abstracción


creado para poder facilitar, y mejorar el diseño de las clases de un programa. Con ella se
pueden crear nuevas clases a partir de clases ya hechas, siempre y cuando tengan un tipo
de relación especial. En la herencia, las clases derivadas “heredan” los datos y las funciones
miembro de las clases base, pudiendo las clases derivadas redefinir estos comportamientos
(polimorfismo) y añadir comportamientos nuevos propios de las clases derivadas. Para no
romper el principio de encapsulamiento (ocultar datos cuyo conocimiento no es necesario
para el uso de las clases), se proporciona un nuevo modo de visibilidad de los
datos/funciones: “protected”. Cualquier cosa que tenga visibilidad protected se comportará
como pública en la clase Base y en las que componen la jerarquía de herencia, y como
privada en las clases que NO sean de la jerarquía de la herencia. Antes de utilizar la herencia,
nos tenemos que hacer una pregunta, y si tiene sentido, podemos intentar usar esta
jerarquía: Si la frase <claseB> ES-UN <claseA> tiene sentido, entonces estamos ante un
posible caso de herencia donde clase A será la clase base y clase B la derivada.

Herencia Múltiple La herencia múltiple es el mecanismo que permite al programador hacer


clases derivadas a partir, no de una sola clase base, sino de varias. Para entender esto
mejor, pongamos un ejemplo: Cuando ves a quien te atiende en una tienda, como persona
que es, podrás suponer que puede hablar, comer, andar, pero, por otro lado, como
empleado que es, también podrás suponer que tiene un jefe, que puede cobrarte dinero por
la compra, que puede devolverte el cambio, etc.

Clases Bases Virtuales:

Dado que una clase puede ser una clase base indirecta de una clase derivada más de una
vez, C++ proporciona una manera de optimizar el funcionamiento de esas clases base. Las
clases base virtuales proporcionan una manera de ahorrar espacio y evitar la ambigüedad
en las jerarquías de clases que usan la herencia múltiple.

Cada objeto no virtual contiene una copia de los miembros de datos definidos en la clase
base. Esta duplicación desperdicia espacio y requiere especificar qué copia de los miembros
de la clase base se desea siempre que se accede a ellos.

Cuando una clase base se especifica como base virtual, puede actuar como base indirecta
más de una vez sin la duplicación de sus miembros de datos.Todas las clases base que
utilizan una clase base como base virtual comparten una única copia de sus miembros de
datos.

Al declarar una clase base virtual, la palabra clave de virtual aparece en las listas base de
las clases derivadas.

Visibilidad: La visibilidad de una propiedad o método se puede definir anteponiendo unas


de las palabras claves public, protected o private en la declaración.

Private: Solo accesible en la clase donde se definen las propiedades.

Protected: solo accesibles por las clases y sus descendientes.

Public: Accesible desde cualquier clase.

Clases abstractas y métodos virtuales

En C++ podemos definir clases abstractas. Son clases pensadas para definir un
comportamiento, es decir, un conjunto de métodos sin implementación. Sus clases
derivadas están obligadas a implementar estos métodos, siempre i cuando queramos que
sean clases concretas instánciales. Los métodos sin implementación de las clases abstractas
reciben el nombre de métodos virtuales.3

Constructores y destructores con herencia

Constructores:

El objetivo de un constructor es el de inicializar un objeto cuando éste es creado.


Asignaremos los valores iniciales así como los procesos que ésta clase deba realizar.

Se utiliza para crear tablas de métodos virtuales y poder así desarrollar el polimorfismo, una
de las herramientas de la programación orientada a objetos (POO). Al utilizar un constructor,
el compilador determina cual de los objetos va a responder al mensaje (virtual) que hemos
creado.
Tiene un tipo de acceso, un nombre y un paréntesis.

En java es un método especial dentro de una clase, que se llama automáticamente cada vez
que se crea un objeto de esa clase.
Posee el mismo nombre de la clase a la cual pertenece y no puede regresar ningún valor
(ni siquiera se puede especificar la palabra reservada void). Por ejemplo si añadiéramos a
la clase Suma un constructor, tendríamos que llamarlo también Suma. Cuando en una clase
no se escribe propiamente un constructor, java asume uno por defecto (que es el
Constructor vacío, es decir sin parámetros).

Constructor por defecto:

Un constructor por defecto es un constructor sin parámetros que no hace nada. Sin embargo
será invocado cada vez que se construya un objeto sin especificar ningún argumento, en
cuyo caso el objeto será iniciado con los valores predeterminados por el sistema (los
atributos numéricos a ceros, los alfanuméricos a nulos, y las referencias a objetos a null).

Constructor con Parámetros:

Un constructor con Parámetros siempre debe especificar algún argumento, en cuyo caso el
objeto será iniciado con los valores indicados por el usuario, y realizará también las acciones
programadas al ejecutarse.

Destructor:

Un destructor en algunos lenguajes de programación orientados a objetos es un método de


una clase que se llama justo antes de una instancia de esa clase y se elimina de la memoria.
No todos los lenguajes de programación orientados a objetos suelen tener un destructor.

La contrapartida de un destructor es un constructor que se ejecuta cuando se crea el objeto,


se instancia y se lo inicializa.
Conclusión

Para entender cómo funciona el paradigma de la programación orientada a objetos es


necesario ver un programa como una colección de objetos que interactúan entre sí
enviándose mensajes y cambiando su estado durante la ejecución.
Resolver un problema bajo el paradigma de la programación orientada a objetos implica
determinar y caracterizar los diferentes objetos que intervienen en el problema, definir sus
propiedades y métodos y ponerlos a interactuar.
Bibliografía

http://www.dccia.ua.es/dccia/inf/asignaturas/LPP/2007-2008/tema-11.html
http://quegrande.org/apuntes/EI/OPT/POO/teoria/08-09/tema_3_-
_propiedades_basicas.pdf

http://www.itnuevolaredo.edu.mx/takeyas/Apuntes/POO/Apuntes/04.-
Polimorfismo.pdf

https://sites.google.com/site/contenidospoo/definicionybeneficios

https://jadsuafu.wordpress.com/2012/08/23/clases-abstractas-con-metodos-
virtuales-y-clases-concretas-derivadas/

https://sites.google.com/site/wwwprogramacionorientadacom/35-
constructores-y-destructores-en-clases-derivadas

Вам также может понравиться