- Publicación de los conceptos
HERENCIA
Es una propiedad que permite que los objetos sean creados a partir de otros ya existentes, obteniendo características (métodos y atributos) similares a los ya existentes. 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 clase 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.
Ejemplo
import javax.*;
import javax.swing.JOptionPane;
public class Mamifero{
private int patas;
private String nombre;
public void imprimirPatas(){
JOptionPane.showMessageDialog(null," Tiene " + patas + " patas\n", "Mamifero", JOptionPane.INFORMATION_MESSAGE);
}
public Mamifero(String nombre, int patas){
this.nombre = nombre;
this.patas = patas;
}
}
public class Perro extends Mamifero {
public Perro(String nombre){
super(nombre, 4);
}
}
public class Gato extends Mamifero {
public Gato(String nombre){
super(nombre, 4);
}
}
public class CrearPerro {
public static void main(String[] args) {
Perro perrito = new Perro("Pantaleon");
perrito.imprimirPatas(); /*Está en la clase mamífero*/
}
}
POLIMORFISMO
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. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en “tiempo de ejecución”, esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en “tiempo de compilación”) de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.
#include
using namespace std;
class Figura {
private:
float base;
float altura;
public:
void 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(){return 2*altura+base}
unsigned float area(){return (base*altura)/2;}
};
void Figura::captura()
{
cout << "CALCULO DEL AREA Y PERIMETRO DE UN TRIANGULO ISÓSCELES Y UN RECTANGULO:" << endl;
cout << "escribe la altura: ";
cin >> altura;
cout << "escribe la base: ";
cin >> base;
cout << "EL PERIMETRO ES: " << perimetro();
cout << "EL AREA ES: " << area();
getch();
return 0;
}
Polimorfismo desde una interfaz
Aunque el polimorfismo es el mismo se aplique donde se aplique, el modo en que se aplica desde una [[interfaz]] puede resultar un poco más oscuro y difícil de entender. Se expone un sencillo ejemplo (en VB-NET) comentado para entender como funciona aplicado desde una interfaz, primero se escribe el código y luego se comenta el funcionamiento.
Nota: para no enturbiar el código en exceso, todo lo que no se declara privado se sobreentiende público.
' Declaramos una interfaz llamada IOperar y declaramos una función llamada Operar
' que implementarán las clases deseadas:
Interface IOperar
Function Operar(valor1 as integer, valor2 as integer) as long
End Interface
Polimorfismo de sobrecarga
El 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.
Polimorfismo paramétrico
El 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.
-float addition (float, float) devolvería la suma de dos flotantes.
-char addition (char, char) daría por resultado la suma de dos caracteres definidos por el autor, etc.
ENCAPSULAMIENTO
Hay muchos datos que no tiene por qué conocerlo aquel que esté usando la clase Persona; ya que son inherentes al objeto y solo controlan su funcionamiento interno; por ejemplo, cuando alguien te ve puede saber inmediatamente si eres hombre o mujer (propiedad) o puede hablarte y obtener una respuesta procesada (método); también puede conocer el color de tu cabello y ojos. En cambio, jamás sabrá que cantidad de energía exacta tienes o cuantas neuronas te quedan, ni siquiera preguntándote ya que ninguna de tus propiedades externas visibles o funciones de comunicación al público te permiten saber esos datos.
Formas de encapsular
Estándar (Predeterminado)
Abierto: Hace que el miembro de la clase pueda ser accedido desde el exterior de la Clase y cualquier parte del programa.
Protegido: Solo es accesible desde la Clase y las clases que heredan (a cualquier nivel).
Semi cerrado: Solo es accesible desde la clase heredada
Cerrado: Solo es accesible desde la Clase.
En el encapsulamiento hay analizadores que pueden ser semánticos y sintácticos.
ABSTRACCION
Podemos definir la abstracción como una operación intelectual que separa las cualidades de un objeto para considerarlas aisladamente o para analizar al objeto en su pura esencia o noción.
Básicamente es la capacidad de separar los elementos (al menos mentalmente) para poder verlos de forma singular. Como cuando describimos el cuerpo humano y decimos cabeza, brazo(s), pierna(s), etc.
En los lenguajes de programación orientada a objetos, el concepto de Clase es la representación y el mecanismo por el cual se gestionan las abstracciones.
Ejemplo de abstracción
En POO, podemos considerar una Persona como un objeto que tiene propiedades (como nombre, altura, peso, color de pelo, color de ojos, etcétera) y métodos (como hablar, mirar, andar, correr, parar, etcétera).
Gracias a la abstracción, otro objeto Tren puede manipular objetos Persona sin tener en cuenta sus propiedades ni métodos ya que sólo le interesa, por ejemplo, calcular la cantidad de personas que están viajando en él en ese momento, sin tener en cuenta ninguna otra información relacionada con dichas personas, tales como la altura, el nombre, el color de ojos, etc.
Ejemplos
1
2
3
4
5
6
7
8
9
10
11
public abstract class Figura {
// Atributos:
public int numeroLados;
public int area;
public int volumen;
// Métodos:
abstract public void calcularArea();
abstract public void calcularVolumen();
}
public float radio;
public static float pi = (float)(3.1415);
public Esfera( int radio ){
this.radio = radio;
this.numeroLados = 0;
}
// 4*pi*r²
public void calcularArea(){
this.area = (4)*pi*radio*radio;
}
// (4/3)*pi*radio³
public void calcularVolumen(){
this.volumen = (4/3)*pi*radio*radio*radio;
}
}
CLASE
Una clase es una construcción usada como plano o patrón para crear los objetos de esa clase. Este plano describe el estado y comportamiento que comparten los objetos de esa clase. Un objeto es contenedor con el que podremos utilizar las propiedades y los métodos públicos de una clase y se pueden crear (instanciar) tantos objetos como necesitemos y todos tendrán los mismos métodos y propiedades.
Una clase puede tener propiedades (atributos) y métodos (funciones) que hacen interactuar a la clase consigo misma o con el mundo exterior
La clase es la base de la Programación Orientada a Objetos, por lo que conviene entenderlo bien. Vamos a ver un ejemplo:
Tenemos una clase llamada Coche que representa coches en nuestro programa y tiene, por ejemplo, los atributos color y posición, y un método mover () que haría que que el coche se moviera, (por ejemplo si nuestro programa fuera un videojuego).
La sintaxis de la definición de clases es bastante parecida en todos los lenguajes, así que vamos a ver como se hace en C#.
Ejemplo
class Nombre {
// Variables miembro (habitualmente privadas)
miembro_1; //lista de miembros
miembro_2;
miembro_3;
// Funciones o métodos (habitualmente públicas)
funcion_miembro_1( ); // funciones miembro conocidas
funcion_miembro_2 ( ); // funciones como métodos
// Propiedades (habitualmente públicas)
propiedad_1;
propiedad_2;
propiedad_3;
propiedad_4;
INTEFACES
Las interfaces definen un conjunto de métodos sin especificar su implementación. Cuando una clase implementa una interfaz debe especificar todos los métodos contenidos en ella.
Para definir una clase que implementa una interfaz hay que usar la palabra clave class*
Ejemplo fome:
1
2
3
4
5
6
7
8
9
10
public interface MatematicaVectorial {
public static double pi = 3.1415;
public static double e = 2.71828;
public double[] sumar(int[][] vectores);
public double[] restar(int[][] vectores);
public double productoPunto(int[][] vectores);
}
La clase VectorR3, que es un vector de R³ implementa MatematicaVectorial
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class VectorR3 implements MatematicaVectorial
{
public double valorX;
public double valorY;
public double valorZ;
public double[] sumar(int[][] vectores){
//Implementacion
}
public double[] restar(int[][] vectores){
//Implementacion
}
public double productoPunto(int[][] vectores)
{
//Implementacion
}
}
¿y para qué hay interfaces, si hacen “casi” lo mismo que las clases abstractas? veamos el porqué
ATRIBUTOS
Los atributos son las características individuales que diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables.
Las variables de instancia también denominados miembros dato, son declaradas en la clase pero sus valores son fijados y cambiados en el objeto.
Además de las variables de instancia hay variables de clase, las cuales se aplican a la clase y a todas sus instancias. Por ejemplo, el número de ruedas de un automóvil es el mismo cuatro, para todos los automóviles.
METODO
Un método es una subrutina cuyo código es definido en una clase y puede pertenecer tanto a una clase, cómo es el caso de los métodos de clase o estáticos, como a un objeto, como es el caso de los métodos de instancia.
INSTANCIA
Una instancia (en inglés, instance) se refiere a una realización específica de una clase o prototipo determinados.
En general, cuando se ejecuta un programa en un computador, se dice que éste se instancia. En lenguajes que crean objetos a partir de clases, un objeto es una instancia de una clase. Esto es, es un miembro de una clase que tiene atributos en lugar de variables. En un contexto del mundo real, podríamos pensar en "Perro" como una clase y en un perro concreto en una instancia de esta clase.
Ejemplo
public class Main {
public static void main(String... args) {
ClassperroClass = Perro.class;
System.out.println(perroClass); }
}
VISIBILIDAD
Las directivas de visibilidad permiten restringir el acceso a los atributos y métodos de un objeto, la directiva más restrictiva es private, que únicamente deja acceder a los atributos y métodos desde la unidad en la que está la clase, en contrapartida, tenemos la public y permite acceder desde cualquier método a los atributos especificados como tales. También existe la directiva protected, de la que se hablara en el tema de herencia que es como private, pero los atributos bajo esta directiva también está disponible en las clases hijas (ATENCIÓN: las directivas explicadas aquí pueden tener una funcionalidad diferente en otros lenguajes. Por ejemplo los atributos y métodos bajo private en C++, también, lo hereda la clase hija y los atributos y métodos bajo protected en C++ pueden ser llamados bajo funciones amigas, etc.).
AGREGACION
Composición de un objeto por otros. Es una relación más débil que la que existe entre el atributo y el objeto al cual pertenece, y más fuerte que una asociación.
Ejemplo
Este es un concepto que se utiliza para expresar tipos de relaciones entre objetos parte-de (part-of) o tiene-un(has-a). El objeto componente, también a veces denominado continente o contenedor, es un objeto agregado que se compone de múltiples objetos.
Tiene-un Tiene-un
Tiene-un Tiene-un
Tiene-un
PERSISTENCIA
En el caso de persistencia de objetos la información que persiste en la mayoría de los casos son los valores que contienen los atributos en ese momento, no necesariamente la funcionalidad que proveen sus métodos.
Ejemplo
public class Cat {
private Long id; // identifier
private Date birthdate;
private Color color;
private char sex;
private float weight;
private int litterId;
private Cat mother;
private Set kittens = new HashSet();
private void setId(Long id) {
this.id=id;
}
public Long getId() {
return id;
}
void setBirthdate(Date date) {
birthdate = date;
}
public Date getBirthdate() {
return birthdate;
}
void setWeight(float weight) {
this.weight = weight;
}
public float getWeight() {
return weight;
}
public Color getColor() {
return color;
}
void setColor(Color color) {
this.color = color;
}
void setSex(char sex) {
this.sex=sex;
}
public char getSex() {
return sex;
}
void setLitterId(int id) {
this.litterId = id;
}
public int getLitterId() {
return litterId;
}
void setMother(Cat mother) {
this.mother = mother;
}
public Cat getMother() {
return mother;
}
void setKittens(Set kittens) {
this.kittens = kittens;
}
public Set getKittens() {
return kittens;
}
public void addKitten(Cat kitten) {
kitten.setMother(this);
kitten.setLitterId( kittens.size() );
kittens.add(kitten);
}
2. Ejercicios