CONCEPTOS
BÁSICOS …
Programación Orientada a Objetos
I.C. Wendy Yaneth García Martínez
Control de acceso a una clase
La tarea de una clase consiste en ocultar la mayor cantidad de información posible.
¿para qué? Para evitar que el código lo corrompa algún programador poco cuidadoso
o ignorante.
Por lo tanto, se imponen ciertas restricciones a la forma en que se puede manipular
una clase.
Existen 3 tipos de usuario de una clase:
La clase misma.
Usuarios genéricos.
Clases derivadas.
Cada tipo de usuario tiene privilegios de acceso asociados a una palabra clase:
private
public
protected
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Modificadores de la clase
public: significa que las definiciones siguientes están disponibles para todo el mundo.
private: significa que nadie, excepto el creador del tipo, puede acceder a estas
definiciones.
protected: actúa como private, con la excepción de que una clase heredada tiene
acceso a sus miembros protegidos pero no a los privados.
Java tiene un “acceso por defecto” que se utiliza cuando no se especifica ninguna de
las palabras clave descritas. Este modo de acceso se suele denominar “amistoso” o
friendly porque implica que las clases puede acceder a los miembros amigos de otras
clases que estén en el mismo paquete (package), sin embargo, fuera del paquete
estos miembros amigos se convierten en privados.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Encapsulación
Es una técnica que permite localizar y ocultar los detalles de un objeto.
La encapsulación previene que un objeto sea manipulado por operaciones distintas de
las definidas.
Consiste en el hecho de empaquetar o proteger las variables miembro con los
métodos miembro.
Proporciona dos beneficios importantes:
Capacidad para crear módulos: El código fuente de un objeto puede escribirse y mantenerse
independiente del código fuente del resto de los objetos. De esta forma, un objeto puede pasarse
fácilmente de una parte a otra del programa.
Protección de información: Un objeto tendrá una interfaz pública perfectamente definida que otros
objetos podrán usar para comunicarse con él. De esta forma, los objetos pueden mantener
información privada y pueden cambiar el modo de operar de sus funciones miembro sin que esto
afecte a otros objetos que usen estas funciones miembro.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Encapsulación…
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Mensajes
Los objetos de un programa interactúan y se comunican entre ellos por medio de
mensajes.
Cuando un objeto A quiere que otro objeto B ejecute una de sus funciones miembro
(métodos de B), el objeto A manda un mensaje al objeto B.
Las partes que componen un mensaje son:
El objeto al cual se manda el mensaje.
El método o función miembro que debe ejecutar.
Los parámetros que necesita ese método.
Los mensajes proporcionan dos ventajas importantes:
El comportamiento de un objeto está completamente determinado por sus métodos, así que los
mensajes representan todas las posibles interacciones que pueden realizarse entre objetos.
Los objetos no necesitan formar parte del mismo proceso, ni siquiera estar en una misma
computadora para mandarse mensajes entre ellos (y de esta forma interactuar).
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Mensajes…
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Constructores
Tienen el mismo nombre que la clase a la que pertenecen y su propósito es inicializar
al objeto cuando se crea desde la clase. Esto permite que los objetos se den a sí
mismos, valores iniciales cuando se crean.
El constructor de un objeto se invoca cuando se crea el objeto. Esto significa que se
invoca cuando se ejecuta la declaración del objeto.
Como su nombre lo dice, un constructor es una función que se utiliza para construir un
objeto de una clase dada. Esto implica:
La creación de objetos con iniciación definida.
La creación de objetos con iniciación especificada.
La creación de objetos copiando otro objeto.
Cada uno de estos procesos implica un tipo diferente de constructor.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Constructores…
Un sub-objeto es un objeto de una clase que se declara dentro de otra clase.
Cuando se tiene una instancia en una clase, su constructor debe crear un objeto de
esa clase.
Si la clase tiene sub-objetos declarados en ella, el constructor tiene que invocar los
constructores de estos objetos.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Herencia
Permite definir nuevas clases partiendo de otras ya existentes.
Las clases que derivan de otras, heredan automáticamente todo su comportamiento, pero
además pueden introducir características particulares o propias que las diferencien.
Por ejemplo: las bicicletas de montaña y de carreras son todas bicicletas.
En términos de POO, estas son subclases o clases derivadas de la clase bicicleta.
Análogamente, la clase bicicleta es la clase base o superclase de las bicicletas de
montaña, de carrera, etc.
Cada subclase hereda los estados (en forma de declaración de variables) de la superclase
de la cual deriva. Por ejemplo: cadencia, velocidad.
Cada subclase hereda los métodos de su superclase. Sin embargo, las clases derivadas
no se limitan por los estados y comportamientos que heredan de su superclase. Al
contrario, pueden añadir variables y métodos a aquellas que han heredado.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Herencia…
El árbol de herencia o jerarquía de clases pueden ser tan extensos como se necesite.
Los métodos y las variables miembro se heredan hacia abajo a través de todos los
niveles de la jerarquía.
Cuanto más abajo está una clase en la jerarquía, más especializado es su
comportamiento.
Por ejemplo, se podría hacer que la clase bicicleta derive de una superclase de
vehículos.
La herencia es una herramienta clave para abordar la resolución de un problema de
forma organizada, pues permite definir una relación jerárquica entre todos los
conceptos que se están manejando.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Herencia…
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Herencia…
La herencia proporciona las siguientes ventajas:
Las clases derivadas o subclases, proporcionan comportamientos especializados a partir de los
elementos comunes que hereda de la clase base.
A través del mecanismo de herencia, los programadores pueden reutilizar el código de la superclase
tantas veces como sea necesario.
Permite implementar las llamadas superclases abstractas, las cuales definen comportamientos
genéricos.
Las clases abstractas definen e implementan parcialmente comportamientos. El propósito de una clase
abstracta es servir de modelo base para la creación de otras clases derivadas, pero cuya implantación
depende de las características particulares de cada una de ellas.
Por ejemplo, a partir de la clase genérica vehículos, se puede ir creando todo tipo de clases derivadas,
entre ellas la clase bicicleta.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Herencia vs. Composición
Hay dos mecanismos para construir clases utilizando otras clases:
Decir que una nueva clase es una especialización de una clase existente y que tiene unas cosas
(atributos y métodos) más que la clase general: Herencia.
Pegar objetos de otras clases dentro de una nueva clase: Composición.
Ejemplos de composición y herencia:
Clase persona y clase empleado:
o Herencia: un empleado es una persona.
Clase persona y clase domicilio:
Composición: una persona tiene un domicilio.
Clase empresa, clase empleado y clase jefe de departamento:
Herencia entre empleado y jefe: Un jefe es un empleado.
Composición entre empresa y empleado o jefe.
Estos son los mecanismos esenciales para evitar la repetición de código y permitir la
reusabilidad, y por tanto, la reutilización de código, que es una de las características
más importantes de la POO.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Herencia
El efecto de la reutilización de código es similar tanto en la composición como en la
herencia. Sin embargo, su uso, funcionamiento, declaración e implementación son
diferentes.
Concepto de Herencia: Es el proceso mediante el cual, un objeto de una clase
adquiere propiedades definidas en otra clase que lo preceda en una jerarquía de
clasificaciones. Permite la definición de un nuevo objeto a partir de otros, agregando
las diferencias entre ellos.
La herencia (generalización/especialización) representa la relación “es un” o “es una”
entre clases. Por ejemplo:
Un profesor es un empleado. Un obrero es un empleado.
Un carro es un vehículo. Una bicicleta es un vehículo.
Un mamífero es un animal. Un ave es un animal.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Herencia…
La herencia es un tipo de jerarquía de clases en la que cada subclase (clase hija,
clase derivada) puede acceder tanto a los atributos como a los métodos públicos y
protegidos de la superclase (clase padre, clase base).
Cada subclase o clase hija en la jerarquía es siempre una extensión de la superclase,
que además incorpora atributos y métodos propios.
En un diagrama de clases, la herencia se representa mediante una relación de
generalización/especificación que se denota con un triángulo de la siguiente forma:
Clase hija Clase padre
Clase derivada Clase base
subclase superclase
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Tipos de Herencia
La herencia se clasifica según el modo de acceso a los miembros de la clase base:
Pública (public): los modos de acceso a los miembros de la clase base se quedan igual en la clase
derivada.
Protegida (protected): los miembros public de la clase base pasan a ser protected. El resto se queda
igual.
Privada (private): todos los miembros de la clase base pasan a ser private en la derivada.
La herencia puede ser simple (cada clase tiene sólo una superclase) o múltiple (cada
clase puede tener asociada varias superclases).
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Composición
Es una relación que representa a objetos compuestos por otros objetos.
El objeto en el nivel superior de la jerarquía es el todo, y los que están en los niveles
inferiores son sus partes o componentes.
Un componente es parte esencial de una entidad.
La relación es fuerte, al punto que si el componente es eliminado o desaparece, la
clase mayor (el todo) deja de existir.
Por ejemplo: la entidad Casa, se puede modelar en términos de sus componentes de
la siguiente forma:
casa <- habitación, baño, terraza; habitación <- puerta, ventana, pared
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Agregación y Composición
La relación de agregación se denota:
Nombre del objeto multiplicidad Nombre del objeto
de nivel superior que lo compone
Por ejemplo:
4…*
carro ruedas
La relación de composición se denota:
Clase componente
Clase mayor
persona Corazón
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Agregación y Composición…
Si la entidad corazón forma parte de la persona, entonces la flecha apunta a la clase
persona, y el diamante va pegado a estas clases.
La diferencia entre la relación carro-ruedas y persona-corazón, es que en el primer
caso se llama agregación por ser una relación en donde la existencia del carro NO
depende de las ruedas; mientras que en el segundo caso, una persona no existe sin
un corazón. Por tanto, la relación de la persona con su corazón es de composición y
se denota con el rombo relleno.
Declaración de la Composición: Solo hay que considerar la posibilidad de que los
atributos o datos miembros de una clase sean objetos, es decir, una clase puede tener
como datos miembros a objetos de otras clases.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Sobrecarga
Una de las maneras que tiene Java de llegar al polimorfismo es a través de la
sobrecarga de funciones.
Dos o más funciones pueden compartir nombre, siempre y cuando en la declaración
sus parámetros sean diferentes.
La sobrecarga se refiere a la práctica de cargar una función con más de un
significado.
La sobrecarga no es un concepto nuevo en los lenguajes de programación, por
ejemplo el operador = está sobrecargado en muchos lenguajes de alto nivel, se utiliza
en instrucciones de asignación y en expresiones condicionales.
La sobrecarga otorga flexibilidad, permite a las personas utilizar código con menos
esfuerzo, ya que extiende operaciones que son conceptualmente similares en
naturaleza.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Sobrecarga…
Las funciones sobrecargadas se distinguen por el número y tipo de sus argumentos.
El tipo de retorno NO se utiliza para distinguir funciones sobrecargadas, por lo tanto
funciones como: void muestra(int q); long muestra(int q); NO son distinguibles y
producen error del compilador.
La sobrecarga sólo funciona dentro de un campo de acción dado.
Cuando se declara en una clase más de una función miembro con el mismo nombre,
se dice que el nombre de la función está sobrecargado en esa clase y su campo de
acción será el ámbito de esa clase.
Las funciones sobrecargadas necesitan diferir en al menos una de las siguientes
formas:
Las funciones deben contener un número de argumentos diferente.
Cuando menos uno de los argumentos debe ser diferente.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Sobrecarga…
La ventaja de sobrecargar las funciones es que permite acceder a conjuntos de
funciones que están relacionadas, utilizando un solo nombre.
En cierto sentido, la sobrecarga de funciones permite crear un nombre genérico para
alguna operación, donde el compilador es el encargado de resolver qué función es la
adecuada para llevar a cabo la operación.
Uno de los usos más comunes de la sobrecarga de funciones se da con los
constructores.
Recuerda que, para sobrecargar una función de construcción de una clase, solo hay
que declarar las diferentes formas que tiene que adoptar, y definir su acción con
respecto a esas formas. Con constructores sobrecargados, se permite al usuario
especificar qué variables han de ser inicializadas de manera explícita y cuales deben
asumir valores definidos.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Polimorfismo
Significa que un nombre se puede utilizar para especificar una clase genérica de
acciones.
El origen del término polimorfismo es simple: proviene de las palabras griegas poly
(muchos) y morphos (forma) multiforme.
El polimorfismo describe la capacidad del código de comportarse de diferentes
maneras, dependiendo de situaciones que se presenten al momento de la ejecución.
Permite que distintos objetos pertenecientes a una misma clase “respondan” de
diferentes formas a un mismo mensaje.
El polimorfismo permite modificar el comportamiento de un método en cada subclase.
Por ejemplo: suponga la superclase mascota quien tiene las subclases gato, perro y
pato. El método “saludar” de cada subclase es diferente.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Resumen
Todos los objetos de una clase comparten las mismas características.
A partir de una clase se puede obtener un objeto (instancia) que se comunica con
otros objetos mediante mensajes.
Cada objeto tiene un estado propio.
Cada objeto responde a un conjunto de peticiones definidas en la interfaz de la clase
a la que pertenece.
Un objeto se compone de:
Interfaz: qué se ofrece
Implementación: cómo se ofrece
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Resumen…
¿Cómo identificar las clases y los métodos de un sistema?
Identificar las clases del sistema: Normalmente, las clases corresponden con los
sustantivos que se utilizan para describir el sistema.
Definir los atributos de las clases: En general, los atributos coinciden con los
adjetivos que se emplean para describir las clases.
Definir los métodos para cada clase: Normalmente, los verbos o las acciones que
describen el sistema corresponderán con los métodos.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
Resumen
Encapsulación:
Consiste en formar un “paquete” con los atributos (variables) y el comportamiento (métodos) de un
objeto.
Los métodos forman la membrana exterior de un objeto y “esconden” los detalles de implementación al
usuario. Además, facilita la reutilización de objetos.
La encapsulación hace que un sistema sea más fácil de comprender y facilita el mantenimiento de una
aplicación.
Herencia:
La herencia es la capacidad de una clase para definirse en términos de otra clase y “heredar” atributos
y responsabilidades de la clase de orden superior.
Polimorfismo:
El polimorfismo es la capacidad de modificar el comportamiento de una clase mediante la sobre
escritura de métodos.
Se define a veces mediante la frase “una interfaz, métodos múltiples”. Esto significa que, en general,
se pueden acceder a toda una clase de operaciones de la misma manera, aunque las acciones
concretas que estén asociadas a cada una de las operaciones, puedan ser diferentes.
@I.C Wendy Yaneth García Martínez - POO Mecatrónica
¿PREGUNTAS?
I.C. Wendy Yaneth García Martínez
@I.C Wendy Yaneth García Martínez - POO Mecatrónica