La abstracción es un proceso de interpretación y diseño que implica reconocer y enfocarse en
las características importantes de una
situación u objeto, y filtrar o ignorar todas las particularidades no esenciales.
Ejemplo: Imaginemos que queremos aplicar la abstracción a las aves:
Clase
La clase es un modelo o
prototipo que define las variables y métodos
comunes a todos los objetos de cierta clase. También se puede mencionar que una
clase es una plantilla genérica para un conjunto de
objetos de similares características. Una clase define el estado y el comportamiento
que todos los objetos creados a partir de esa
clase tendrán.
Ejemplo:
Ejemplo desarrollado en Java:
Ejemplo desarrollado en C++:
Ejemplo desarrollado en Python:
Atributo
Es una característica de un objeto, que ayuda a
definir su estructura y permite diferenciarlo de otros objetos.
Se define con un identificador y un tipo, el cual indica los valores que puede
almacenar. El conjunto de valores de los campos definen
el estado del objeto.
Métodos
Los métodos son los comportamientos o conductas de un
objeto y permite identificar la forma en que actúa respecto a su entorno
o respecto a otros objetos. Además, representa una operación o función que un objeto
realiza. El conjunto de los métodos de un objeto determinan el
comportamiento general del objeto.
Objeto
Los objetos de software, al igual que
los objetos del mundo real, también tienen características
y comportamientos. Un objeto de software mantiene sus características en uno o más
atributos e implementa su comportamiento con métodos.
- Es una entidad real o abstracta, con un papel definido en el dominio del
problema.
- Un objeto es una instancia de una clase, que tiene: identidad,
estado(atributos) y comportamiento(metodos).
Para el ejemplo anterior de la Clase UniversityStudent (Estudiante universitario),
la creacion de objetos se haria de la siguiente forma:
Instancia
Es la particularización, realización específica u
ocurrencia de una determinada clase,
entidad o prototipo. Una instancia de una clase es un objeto.
Ejemplo:
Si se tiene la anterior clase Animal, se podría crear una instancia de esa clase
como un objeto.
En este caso, una instancia de la clase Animal es la creación de un nuevo objeto
(perro) de nombre "Zeus" y raza "labrador". También se puede
definir una instancia de una clase dentro de otra clase como el siguiente ejemplo .
Como se puede observar, la clase Estudiante tiene una instancia de la clase Nota
como atributo (evaluación).
Diagramas de clases
Cuando se está planteando el diseño y el modelo de los objetos mediante la
abstracción, existe una forma de plasmar esos prototipos a través de un
diagrama de clases. Formalmente, se describe como un tipo de diagrama de estructura
estática que representa la estructura de un sistema mostrando las clases,
sus atributos, operaciones (o métodos), y las relaciones entre los objetos.
En los diagramas de clase, se tienen notaciones que son comunes dentro del lenguaje
de modelado unificado (UML). Por ejemplo, la
herencia se
dibuja
mediante un triángulo donde su eje superior apunta a la clase padre. La visibilidad
de los atributos que tiene la clases se denota con un + (público), - (protegido),
# (protegido). La relación que tiene un objeto con otro se representa dependiendo de
su categoría, una relación de asociación es una línea sencilla que
une las dos clases vinculadas, una relación de agregación (existe una instancia de
un objeto en una clase) se describe mediante un rombo vacío y una relación
de composición(la existencia de una clase depende absolutamente de otra) se
representa con un rombo relleno.
Para este ejemplo concretamente, la clase
Empleado y la clase
Cliente
heredan de la clase
Persona. Todos los atributos de las clases son
privados, como se detalla en la clase
Persona con el signo negativo antes de
nombre y edad. Además, existe una relación de composición entre la
clase
Empleado y la clase
Empresa, es decir, si un objeto
Empresa deja de existir, la clase
Empleado también va a dejar de
existir.
Mensaje
Un mensaje es una comunicación dirigida desde un objeto A ordenando a otro
objeto B
que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo
generó.
Los mensaje son los que permiten la comunicacion entre objetos.
Ejemplo:
Constructor
Cuando se crea un objeto es
necesario inicializar sus variables con valores coherentes. Esto se hace por medio
de un constructor que tiene las siguientes características: Se llama igual que la
clase. Retorna una instancia de una clase Pueden existir varios, pero siguiendo las
reglas de la sobrecarga de funciones. De entre los que existan, tan sólo uno se
ejecutará al crear un objeto de la clase.
Constructor en Python y Constructor en PHP
Destructor
Es un método de una clase cuyo fin es eliminar un objeto de una clase.
Constructor en C++ y su respectivo destructor en C++
Evento
Los eventos son todas las acciones que el usuario inicia al dar clic sobre
un
botón, presionar una tecla, etc. Cada vez que se produce un evento se crea
un objeto.
Una ventana con un botón y el resultado de darle clic al botón
Sobreescritura
Consiste en sobreescribir métodos heredados de una clase padre.
Ejemplo de la clase Animal (Clase padre) y las clases perro y oveja (Clases
hijas) sobreescribiendo el método "hacerSonido heredado"
Hecho en Python3
Clase Abstracta
Este tipo de clases nos permiten crear "métodos generales", que recrean un
comportamiento común,
pero sin especificar cómo lo hacen. A nivel de código tiene por particularidad que
algunos de sus métodos no tienen “cuerpo de declaración“.
- Una clase que declara la existencia de métodos pero no la implementación de
dichos métodos (o sea, las llaves { } y las sentencias entre ellas),
se considera una clase abstracta.
- Una clase es declarada abstracta cuando no es posible crear instancias de
ella.
- Una clase debe ser declarada abstracta si posee al menos un método declarada
abstracto.
- Un método abstracto es aquel que no posee implementación.
Clases abstractas vs Interfaces
Interfaz
Es un conjunto de métodos abstractos y
de constantes cuya funcionalidad es la de determinar
el funcionamiento de una clase, es decir, funciona como un molde o como una
plantilla. También es una descripción de las acciones que un objeto
puede hacer. En programación orientada a objetos una interfaz X describe todas las
funciones que un objeto debe tener para poder ser un X.
- Una interface es una variante de una clase abstracta con la condición de que
todos sus métodos deben ser abstractos. Si la interface va a tener
atributos, éstos deben llevar las palabras reservadas static final y con un
valor inicial ya que funcionan como constantes por lo que, por convención,
su nombre va en mayúsculas.
- Una clase implementa una o más interfaces (separadas con comas ",") con la
palabra reservada implements.
- La principal diferencia entre interface y abstract es que una interface
proporciona un mecanismo de encapsulación de los protocolos de los métodos
sin forzar al usuario a utilizar la herencia.
Ejemplo:
Un ejemplo de uso de una interfaz se presenta en la siguiente imagen a través de un
diagrama de clases, donde
las clases InstrumentoMusical y Sirena implementan de la interfaz Sonoro
que cuenta con la declaración del
método sonar(volumen: int).
Métodos de acceso
Son los métodos o funciones que permiten obtener o modificar los atributos
de un
objeto. Además,
estos métodos tienen la limitación de proveer información acerca del estado de un
objeto específicamente sus propiedades.
En el ejemplo anterior se pueden visualizar dos métodos de acceso de la clase
CuentaBancaria.
El método
getNumeroCuenta() retorna
el atributo numeroCuenta y no tiene ninguna otra especialidad. El método
setNumeroCuenta(String
numeroCuenta) actualiza el atributo
numeroCuenta de acuerdo al valor pasado por parámetro.
Modificadores de acceso
Son palabras claves de
los lenguajes de programación orientado
a objetos para configurar la accesibilidad a las clases, métodos o
propiedades.
Modularidad
La modularidad es la propiedad que permite dividir una aplicación en partes
más pequeñas ( llamadas módulos ), cada una de las cuales debe ser tan independiente
como sea posible de la aplicación en sí y
de las restantes partes.
En el lenguaje de programación Java y en algunos entornos de desarrollo integrado
(IDE), la modularidad radica en la separación de
todos los posibles paquetes de código. La siguiente imagen muestra la división que
se hace a partir de una aplicación base o un servicio
general, que se divide en diferentes módulos con un propósito especial y finalmente
un subdivición en pequeños paquetes de código que integran
las clases.
Encapsulamiento
- Es la propiedad que permite asegurar que la información de un objeto está
oculta del mundo exterior.
- El encapsulamiento consiste en agrupar en una Clase las
características(atributos) con un acceso privado y los comportamientos
(métodos) con un acceso público.
- Acceder o modificar los miembros de una clase a través de sus métodos.
Ejemplo:
Cuando no hay encapsulamiento se pueden presentar problemas:
Podemos ver que cuando no hay encapsulamiento los atributos pueden tomar valores
inconsistentes, lo cual seria fatal para cualquier sistema.
Aplicando el encapsulamiento tenemos:
Con el resultado anterior vemos que el encapsulamiento nos ayuda a proteger la
integridad de los datos y nos asegura que los atributos de nuestra clase solo podran
ser accedidos a traves de los metodos definidos en dicha clase.
Ejemplo de encapsulamiento en C++:
Ejemplo de encapsulamiento en Python:
Herencia
Es una propiedad que permite crear clases a partir de otras ya existentes,
obteniendo características (métodos y atributos) similares a los ya existentes.En
otras palabras la nueva clase (subclase o clase derivada) puede utilizar la misma
implementación de su superclase (clase base) o especificar una nueva implementación.
- Es la relación entre una clase general y otra clase mas especifica.
- Es un mecanismo que nos permite crear clases derivadas a partir de clases
base.
- Nos permite compartir automáticamente métodos y datos entre clases,
subclases y objetos. Por ejemplo: Si declaramos una clase párrafo derivada
de un clase texto todos los métodos y variables asociadas con la clase texto
son automáticamente heredados por la subclase párrafo.
Herencia simple: Es cuando una clase hereda de sólo una clase base.
La clase B hereda de la clase A.
Ejemplo:
La clases Circle, Line y Triangle heredan todos los atributos y
métodos de la clase Shape.
Herencia múltiple: Es cuando una clase hereda de dos o más clases
base.
La clase C hereda tanto de la clase A como de la clase B.
Ejemplo:
En este ejemplo, las clases Passenger y Employee heredan de la clase
Human y las clases FlyingPlane y GroundPlane heredan de la
clase Plane.
h5>
Polimorfismo
Son comportamientos diferentes, asociados a objetos distintos,
pueden compartir el mismo nombre; al llamarlos por ese nombre se utilizará el
comportamiento correspondiente al objeto que se esté usando.
El método hablar puede ser sobreescrito por cualquier entidad (humano, perro,
pato, gato).
Ejemplo:
Ambas clases deben sobreescribir el método getArea() puesto que se calculan de
diferentes maneras en cada caso.
Tipos de polimorfismo:
- Polimorfismo Ad Hoc
- Polimorfismo paramétrico
- Polimorfismo de subtipos
Polimorfismo Ad Hoc: Se refiere a funciones que cambian su comportamiento
dependiendo del tipo de argumentos que reciben (sobrecarga de métodos o
funciones).
La sobrecarga de métodos hace referencia a varios métodos con el mismo nombre pero
con diferentes firmas.
Ejemplo:
En el lenguaje de programación
ABAP4 también se permite la sobrecarga de
métodos como un tipo de polimorfismo.
En el ejemplo anterior tenemos la clase
Empleado y se desea realizar la
sobrecarga del método
modificarNombre. Este tipo de
polimorfismo se implementa como se muestra en la siguiente imagen, el método recibe
un parámetro
i_nombre para una funcionalidad
específica y como segunda medida, el método recibe dos parámetros
i_nombre y
i_apellido para otro procedimiento en particular.
Polimorfismo paramétrico: El polimorfismo paramétrico permite que las
funciones y las clases puedan escribirse de forma genérica, de tal manera que pueda
manipular los datos de la misma manera sin importar el tipo.Ejemplos:
- C++ - Templates
- Java - Generics
Polimorfismo de subtipos: Es una forma de polimorfismo en la cual los
subtipos de un tipo pueden sustituir el comportamiento de las funciones del
supertipo con su propia implementación.
Atributos estáticos
Son atributos inherentes a la clase en sí y no a una instancia de esta.
Ejemplo de la clase estudiante con el atributo estático numero_estudiantes.
Este atributo, como se puede observar, incrementa su valor en
1
cada vez
que se crea una instancia de esta clase, este atributo, como ya se mencionó,
pertenece a la clase
y no al objeto, así que el número de estudiantes será de la clase
Estudiante
y no del objeto
instanciado de esta.
Ejemplo del uso de atributos estáticos
Como se ve en el ejemplo, se instanciaron
3 objetos de la
clase
estudiante
al consultar este atributo se debe accedes desde la clase
estudiante y no
desde la instancia de esta.
Métodos estáticos
Son métodos inherentes a la clase en sí y no a una instancia de
esta.
Ejemplo del método estático ordenarAlfabeticamente que retorna una
lista ordenada
lexicográficamente.
Clases estáticas
Ejemplos de clases estáticas en java y el acceso a ellas.