Академический Документы
Профессиональный Документы
Культура Документы
Objectivos
Comprender el paradigma Orientado a Objetos y sus conceptos: encapsulacin, herencia y polimorfismo Aplicar los conceptos del paradigma orientado a objetos para un lenguaje orientado a objetos en particular principalmente Java, otros (C#, C++) Comparar los diferentes enfoques de implementaciones de diferentes lenguajes de programacin orientado a objetos
Bibliografia
Contenidos
Introduccin
Vivimos en un mundo lleno de objetos...
En el mundo real cada cosa es un objeto: una silla, un perro, una casa, un coche, una persona...etc. Nosotros creamos programas basndonos en este modelo de objetos de la vida real.
Introduccin
Cada objeto tiene tres caractersticas bsicas:
Identidad lo hace nico y diferente Estado (datos, atributos, propiedades, etc): que describen el objeto Comportamiento (mtodos, operaciones, servicios, funciones, etc): que permite la manipulacin del objeto en una variedad de formas
Introduccin
Ejemplo
Silla A Silla B
Identidad: dos sillas similares, pero los dos son diferentes (identidad A vs identidad B) Estado: coste, dimensiones, alto, ancho, localizacin, color, material, etc. Comportamiento: compra, venta, mover, etc. (operaciones que normalmente modifican el estado del objeto)
7
Objetos
Nosotros podemos pensar que un objeto es una capsula que contiene los atributos y las operaciones
Objecto: silla Coste Dimensiones altura Localizacin Color Comprar Vender Mover
Clases
Cada objeto pertenece a una clase mucho ms grande de objetos.
La clase es como una plantilla que describe cada uno de los atributos/operaciones comunes al conjunto de objetos.
tv
Clases
Los objetos heredan todos y cada uno de los atributos y las operaciones de la clase a la que pertenecen.
Representaremos las clases con sombra Clase: muebles Clase: muebles Coste Coste Dimensiones Dimensiones Medidas Medidas Localizacin Localizacin Color Color Comprar Comprar Vender Vender Mover Mover Representaremos los objetos sin sombra Objecto: mesa Coste Dimensiones Medidas Localizacin Color Comprar Vender Mover Objecto: silla Coste Dimensiones Medidas Localizacin Color Comprar Vender Mover
10
Clases
Con la clase, podemos identificar los objetos del mundo real que mantienen propiedades similares y definirlos todos juntos en una estructura comn La clase es el elemento principal de un programa orientado a objetos En tiempo de ejecucin creamos instancias u objetos de la clase y los manipulamos de alguna manera
clases programa runtina
11 objectos
Clases
Ejemplo (Java)
Java
Definicin de la clase
public class Point { int x; int y; void move(int newx, int newy) { x = newx; y = newy; } }
Creacin de un Objecto
12
Clases
Ejemplo (C#)
C#
Definicin de la clase
public class Point { int x; int y; void move(int newx, int newy) { x = newx; y = newy; } }
Creacin Objecto
13
Clases
Ejemplo (C++)
Definicin de la clase
C++
Instancia Esttica. El objeto es almacenado en el momento. Cuando la funcin termina el objeto ya no est disponible
... int main() {
class Point { int x; int y; void move(int newx, int newy); } void Point::move(int newx, int newy) { x = newx; y = newy; }
Point pt1;
pt1.move(1,2); Point *pt2 = new Point(); pt2->move(1,2); } ...
Instancia Dinmica. El objeto se almacena en la pila, cuando la funcin termina El objeto sigue disponible.
14
Clases
Ejemplo (C++)
C++
Mtodos en lnea
Definicin de la clase
class Point { int x; int y; void move(int newx, int newy) { ... } }
15
Constructores
Para empezar a trabajar con objetos estos deben ser creados. El proceso para crear un objeto tiene dos pasos:
Asignacin de memoria: Se asigna la memoria necesaria para los atributos del objeto. Inicializacin: Se inicializan los valores de los atributos .
El constructor es una operacin especial que es invocada despus de la asignacin de objetos con el fin de iniciar sus atributos. El constructor es responsable de la asignacin y la inicializacin de todos los recursos de los objetos 16 necesarios antes de sufrir alguna manipulacin.
Constructores
Ejemplo (Java)
Java
17
Constructores
Ejemplo (Java)
Java
El constructor puede estar sobrecargado (varios constructores) Constructores encadenados: un constructor puede invocar otros constructores
public class Point { int x, int y; Point() { this(0,0); }
... public static void main(String[] args) {
18
Constructores
Ejemplo (Java)
Java
19
Constructores
Ejemplo (C++)
C++
Point pt1;
Point pt2(10,10); Point *pt3 = new Point(); Point *pt4 = new Point(10,10); } ...
Instancia Dinmica. El objeto esta almacenado en la pila. Cuando la funcin termina el objeto continua disponible
20
Destructores
Una vez que el objeto ya no se usa , este debe ser destruido y desasignado de la memoria. El proceso de destruir un objeto tiene dos pasos:
Cancelacin de asignacin de objetos/atributos: todos los recursos obtenidos durante el ciclo de vida del objeto se debe desasignar. La destruccin del objeto: el objeto en s se destruye la memoria y no est disponible ms.
El destructor es un mtodo especial que se invoca antes de que el objeto se destruya. El destructor es el responsable de cancelar la asignacin de cualquier recurso obtenido durante el ciclo de vida del objeto. 21
Destructores
Ejemplo (Java)
Java no soporta la gestin de memoria explcita
Java
Nosotros podemos crear objetos (usando el operador new) pero no podemos destruirlos explcitamente
Slo podemos marcar un objeto como "destruido" por la prdida de su referencia (ajustar el contenido de la variable a null) El garbage collector(basurero) es un proceso especial de la mquina virtual Java que se ejecuta de vez en cuando y busca referencias perdidas . El garbage collector invoca al mtodo finalize() y destruye los objetos (desasignando la memoria) 22
Destructores
Ejemplo (Java)
Java
Podemos especificar su comportamiento, por defecto (no hace nada) y podemos definir el cdigo que debe ejecutarse antes de que el objeto se destruya. Por lo tanto tenemos la oportunidad de cancelar la asignacin de todos los recursos antes de que el objeto se destruya.
23
Destructores
Ejemplo (Java)
public class Square { Point topL eft,bottomRight; Square() { topL eft = new Point(0,0); bottomR ight = new Point(10,10); } public void finalize() { topL eft = null; bottomR ight = null; } ... }
... public static void main(String[] args){ Square square = new Square(); // usamos square // marcamos el objeto como destruible square = null; // despus de esta lnea, el garbage // collector puede destruir el objeto } ...
Java
24
Destructores
Ejemplo (C++)
C++
Un objeto es destruido, ya sea por sus acabados de alcance, o porque se destruyen de forma explcita mediante la palabra clave delete. Cuando se destruye el objeto, se llama al destructor con el fin de liberar recursos previamente asignados. El destructor debe tener el mismo nombre de la clase, pero precedido de ~, y no devuelve ningn valor.
25
Destructores
Ejemplo (C++)
class Rectangle { Point topL eft, bottomR ight; R ectangle(); ~R ectangle(); } R ectangle::Rectangle() { topL eft = new Point(0,0); bottomR ight = new Point(10,10); } R ectangle::~Rectangle() { delete topL eft; delete bottomR ight; } ... void anyFunction() {
C++
// se crea el objeto // de alcance local Rectangle rect; ... // cuando la funcin termina // el objeto es destruido automticamente dado su alacance } ...
Packages
Las Clases son organizadas en paquetes y subpaquetes que ayudan a agrupar todas las clases que ocupan funciones relacionadas. Los paquetes generalmente toma la forma de un rbol. Los paquetes suele modificar el nombre completo de la clase, convirtindose en el prefijo del nombre de la clase.
package A package B C C D D
package A package B C D
27
Packages
Ejemplo (Java)
Java
package geometry;
public class Point { public class Square { int x, y; Point topL eft,bottomRight; ... ... } } al mismo La clase pertenece
package
... public static void main(String[] args) { geometry.Square square = new geometry.Square(); ... }
28
Packages
Ejemplo (Java)
Java
import geometry.Square; import geometry.*; public static void main(String[] args) { Square square = new Square(); ... }
29
Packages
Ejemplo (Java)
Java
package geometry;
public class Point { public class Polygon { int x, y; geometry.Point[] points; ... ... } } a un package diferente La clase pertenece
import geometry.polygons.Polygon; import geometry.*; public static void main(String[] args) { Polygon poly = new Polygon(); ... }
30
Packages
Ejemplo (C#)
C#
Mensajes
Hasta ahora hemos visto que un objeto contiene el estado (atributos) y comportamiento (operaciones).
Cada vez que el objeto recibe un estmulo, se inicia un cierto comportamiento (se ejecuta una operacin). Los mensajes son los estmulos comportamiento de los objetos. que inician el
operations:
operations:
32 message
Mensajes
Se enva un mensaje al destino, y una operacin se ejecuta en el receptor. Antes de enviar el resultado, otro mensaje/s de otro objeto/s pueden ser enviados.
obj1 attributos: obj2 attributos: obj3 attributos:
operaciones:
[obj2, {return}]
operaciones:
op
op
33
Mensajes
Ejemplo (Java)
Java
Las Operaciones son llamadas Mtodos Un mtodo es invocado (un mensaje es enviado) para ello se usa la siguiente sintaxis: destino.operacin (parmetros)
public static void main(String[] args) { Point pt = new Point(); pt.move(10, 10); ... }
34
Encapsulacin
Los atributos que describen una clase suelen ser encerrado por una "pared" de las operaciones que son capaces de manipular los datos de alguna manera. La nica manera de alcanzar atributos es ir a travs de uno de los mtodos que forman la pared Nosotros decimos que la clase encapsula los datos
Clase nombre Clase nombre atributos: atributos: operaciones atributos:
operaciones operaciones
35
Encapsulacin
Para soportar la encapsulacin, los lenguajes de programacin orientados a objetos suelen proporcionar modificadores de accesibilidad: pblico, privado, protegido amigo,, etc
Los modificadores de acceso pueden afectar a cualquier miembro de la clase (ya sean atributos u operaciones)
La regla de oro es que para ocultar los datos y publicar slo las operaciones necesarias (se cumple el principio de ocultacin de informacin: ensear tan poca informacin como sea posible)
36
Encapsulacin
Ejemplo (Java)
Java
default (por defecto: package visible). El miembro es accesible por la misma clase y de cualquier clase dentro del mismo paquete. public: el miembro es accesible por todo el mundo protected: el miembro es accesible por la misma clase, las subclases y la clase de cualquier dentro del mismo paquete. private: el miembro es accesible slo desde la misma clase.
37
Encapsulacin
Ejemplo (Java)
Java
Los atributos son marcados como privados. Entonces ellos son accesibles a travs de los mtodos consultor (getXX()) y modificador (setXX()). Consultores y modificadores pueden filtrar / extender/ generar/ etc. Informacin, y finalmente aceptar o rechazar la operacin.
38
Encapsulacin
Ejemplo (Java)
Java
public class Point { private int x = 0; private int y = 0; public void move(int newx, int newy) { x = newx; y = newy; } public void setX (int newx) { x = newx; } public int getX () { return x; } public void setY (int newy) { y = newy; } public int getY () { return y; } }
Consultores
Modificadores
39
Encapsulacin
Ejemplo (C#)
C#
internal (cuando no se usa modificador): conjunto visible. El miembro es accesible desde la misma clase. public: el miembro es accesible por todo el mundo protected: el miembro es accesible por la misma clase y alguna subclase private: el miembro es accesible slo por la misma clase.
40
Encapsulacin
Ejemplo (C#)
C#
C# soporta el concepto de 'propiedad'. Una propiedad es un atributo que se ha adjuntado un consultor y/o un mtodo de actualizacin.
public class Point { private int x = 0,y = 0;
Propiedades public int PositionX { Getters and Setters get { return x; } set { x = value; } Son opcionales
} public int PositionY { get { return y; } set { y = value; } } }
... public static void Main() { Point pt = new Point(); pt.PositionX = 10; pt.PositionY = 10; } ...
41
Encapsulacin
Ejemplo (C++)
C++
public: el miembro es accesible por todo el mundo. protected: el miembro es accesible por la misma clase y subclases. private (por defecto): el miembro es accesible slo por la misma clase. friend: un friend es una funcin externa o clase que tiene acceso a componentes internos (miembros privados y protegidos de otra clase).
42
Encapsulation
Ejemplo (C++)
... void myFriend(Point pt) { pt.x = 10; pt.y = 10; } ...
C++
class Point { private: int x, y; public: int getX (); void setX (int); int getY (); void setY (int); friend void myFriend(Point); friend class Square; } int Point::getX () { return x; } void Point::setX (int newx) { x = newx; } int Point::getY () { return y; } void Point::setY (int newy) { y = newy; }
class Square { ... } void Square::fn(Point pt) { pt.x = 10; pt.y = 10; } ...
43
Agregacin
Es tambin conocida como composicin. Un contenedor contiene uno o ms componentes. Esto significa que un objeto puede contener atributos que son objetos en s mismos. Agregacin fuerte: El ciclo de vida de los componentes est ligado al ciclo de vida del contenedor (Ej: cuando el contenedor muere todos los componentes tambin mueren).
Fuerte Coche
ruedas Motor Ojos
Persona
Nariz
44
Agregacin
Ejemplo (Java)
Java
Agregacin Fuerte - Cuando el cuadro es creado, ambos puntos son creados - Cuando el cuadro es destruido, ambos puntos son destruidos
45
Herencia
como
generalizacin
Es el mecanismo que permite el diseo de clases basadas en otras clases bsicas heredando/extendiendo toda la informacin descrita es aquellas clases. La clase bsica es llamada clase padre, superclase o clase general. La clase que hereda toda la informacin es llamada subclase, clase hija, clase derivada o clase especializada.
46
Herencia
Es un mecanismo muy poderoso para la reutilizacin de cdigo. Todo lo que se define en la superclase est disponible en la subclase.
Forma aributos: aributos: Forma Shape
attributes:
operaciones: operaciones:
operations:
herencia
Crculo atributos: atributos: Crculo Shape
Herencia
Cuadrado Shape Cuadrado atributos: atributos:
attributes:
attributes:
operaciones: operaciones:
operations:
operations:
operaciones: operaciones: 47
Herencia
attributes:
hereda
Crculo atributos: atributos: Crculo Shape
hereda
Cuadrado Shape Cuadrado atributos: atributos:
attributes:
attributes:
Herencia
49
Herencia
Herencia Simple
Si una subclase necesita caractersticas de ms de una clase deber usar la agregacin para usarlas. La jerarqua son rboles estrictos.
50
Herencia
Herencia Mltiple
Una subclase puede heredar de ms de una clase padre. La jerarqua ya no es necesariamente en forma de rboles.
51
Herencia
Herencia Mltiple
Posible problema: colisiones Colisiones: cuando dos caractersticas que vienen de diferentes clases padre tienen el mismo nombre. Solucin: (1)Evitar esta situacin y generar error de compilacin. (2)Ocultar una caracterstica en favor de la otra. (3)cuando se utiliza la caracterstica, requiere la especificacin de cul de las dos caractersticas heredadas hace referencia. Algunos lenguajes prohben la herencia mltiple para evitar confusiones.
52
Herencia
Ejemplo (Java)
Java
Java implementa Herencia simple con clases pero Herencia mltiple con interfaces Para esto usa la palabra clave 'extends'
public class Circle extends Shape { public Circle() { ... } ... }
public class Shape { public Shape() { ... } public void draw() { ... } public float area() { ... } ... }
53
Herencia
Ejemplo (Java)
Java
Cuando un objeto de una subclase es creado, los constructores de la clase padre son invocados primero.
1
public class Shape { public Shape() { ... } public void draw() { ... } public float area() { ... } ... }
54
Herencia
Ejemplo (Java)
Java
Nosotros podemos usar 'super' para encadenar los constructores de la subclase y superclase (debe ser la primera instruccin del constructor)
{ ... } a) { ... } a, int b) { ... }
public class Shape public Shape() { public Shape(int public Shape(int ... }
public class Square extends Shape { public Square() { super(0,0); // make something else } ... }
55
Herencia
Ejemplo (Java)
Java
La subclase puede redefinir (overwrite) los mtodos definidos en la superclase. Cuando redefinimos el prototipo del mtodo debe ser el mismo.
Si cambia el nombre entonces es otro mtodo. Si el nmero o el tipo de parmetros cambia entonces es otro mtodo con el mismo nombre. (overloading). Si cambia el valor que devuelve , entonces error.
Herencia
Ejemplo (Java)
public class Shape { protected Color color; protected double area; public void setArea(double area) { this.area = area; } public double getArea() { return area; } public String toString() { return Shape with area + area; } public boolean equals(Object x) { Figure fx = (Figure)x; return (color.equals(fx.color) && area == x.area); } }
Java
57
Herencia
Ejemplo (Java)
public class Circle extends Shape { protected double radio; public void setRadio(double radio) { this.radio = radio; } public double getRadio() { return radio; } /* Overwritten methods */ public String toString() { return super.toString() + and with radio + radio; } public boolean equals(Object x) { Circle cx = (Circle)x; return (super.equals(x) && radio == cx.radio); } }
Java
58
Herencia
Ejemplo (Java)
Java
En Java, la clase java.lang.Object es el padre de cualquier otra clase Si una clase no se extiende a otra clase , entonces por defecto se extiende a Objeto
59
Herencia
Ejemplo (Java)
Java
wait(), notify(), notifyAll(): procesos de sincronizacin hashCode(): cdigo nico para objeto toString(): String representacin de un objeto equals(): igualdad entre objetos
60
Herencia
Ejemplo (C#)
C#
Slo soporta Herencia simple Herencia con clases pero Herencia mltiple con interfaces (como Java) Para esto usa el smbolo ':'
public class Shape { ... public void draw() { ... } public float area() { ... } ... } public class Circle: Shape { ... }
61
Herencia
Ejemplo (C#)
C#
Cuando un objeto de una subclase es creado, los constructores de la clase padre son invocados primero.
Las clases derivada pueden comunicarse con las clases base usando la palabra clave 'base'
public class Shape { public Shape() { ... } public Shape(int a) { ... } ... }
Herencia
Ejemplo (C#)
C#
La subclase puede redefinir (overwrite) los mtodos definidos en la superclase. Cuando redefinimos el prototipo del mtodo debe usar el mismo nombre.
Si el nombre cambia entonces es otro mtodo. Si el nmero o el tipo de parmetros cambia entonces es otro mtodo con el mismo nombre. (overloading). Si cambia el valor que devuelve , entonces error.
Herencia
Ejemplo (C#)
C#
Si el mtodo en la supercalse est marcado como virtual' entonces el mtodo redefinido debe estar marcado con 'override' (ms adelante Polimorfismo) Si el mtodo de la superclase no est como virtual' entonces el mtodo redefinido debe estar marcado como 'new' El comportamiento del mtodo redefinido es diferente como veremos en Polimorfismo.
64
Herencia
Ejemplo (C#)
C#
public class Shape { public void draw() { ... } public virtual float area() { ... } }
public class Circle: Shape { public new void draw() { ... } public override float area() { ... } }
65
Herencia
Ejemplo (C++)
C++
El smbolo ':' se usa con los especificadores de acceso (public, private, protected) . El especificador de acceso es opcional, si no se especifica por defecto se asume privado (private) El especificador de acceso limita el nivel ms accesible de lo miembros heredados de la clase base Ej Los miembros con un nivel ms accesible son heredados con el mismo nivel.
66
Herencia
Ejemplo (C++)
class Circle: public Shape { ... }
C++
class Shape { public: void draw(); float area(); ... } void Shape::draw() { ... } float Shape::area() { ... }
67
Herencia
Ejemplo (C++)
C++
class Child: public Shape, public Whatever { public: void otherTask(); ... }
68
Herencia
Ejemplo (C++)
C++
Ambiguedades (colisiones) se resuelven usando el calificador ClassName::o usando la palabra clave virtual (ms sobre esto en Polimorfismo)
class A { public: int i,j void g(int) { } } class B { public: int j; void g() { } } class C: public A, public B { public: int i; }
int main() { C obj; obj.i = 5; // obj.j = 10; obj.A::j = 10; // obj.g(); obj.B::g(); }
Ambiguedad: atributo 'j' llega de dos fuentes. Usando A::j qualificador decide cual de ambos es usado
Ambigedad: a pesar de tener diferentes argumentos el nombre `g ` Tiene dos fuentes usando B::g se decidira cual se usa
69
Herencia
Clases Abstractas
Java
Una clase abstracta es una clase que est parcialmente definida y por lo tanto no se pueden crear instancias (no se pueden crear objetos de una clase abstracta). Una clase abstracta contiene mtodos abstractos. Un mtodo abstracto es un mtodo no implementado. Una clase abstracta por lo general recoge un conjunto de definiciones comunes que deben ser redefinidas por subclases siguientes. Las subclases deben implementarse (redefinirse) el mtodo abstracto o ellas tambin seran abstractas.
70
Herencia
Clases Abstractas . Ejemplo (Java)
Java
Usamos 'abstract'
public abstract class MyClass { ... }
Herencia
Clases Abstractas . Ejemplo (C++)
C++
En C++, un mtodo abstracto es llamado pure virtual method Una clase con un mtodo virtual es abstracto.
class Polygon { private: int width, height; public: void setWidth(int); void setHeight(int); virtual int area() = 0; }
72
Interfaces
Es un concepto que soporta encapsulacin Encapsulacin permite ocultar algunos datos (tpicamente datos), y publica otros miembros (por lo general operaciones) Nosotros podemos implementacin separar la interface de su
Interface: es la parte estable y pblica y que define las operaciones que un componente particular debe tener. Implementacin: es la parte oculta y cambiante , se define la implementacin de las operaciones as como los atributos particulares necesarios para la ejecucin de tales operaciones.
73
Interfaces
La interface llega a ser independiente de la implementacin. Slo las partes necesarias se publican el resto permanece oculto. A nosotros no nos centraremos en la implementacin, solo en las operaciones que nosotros podemos usar con un objeto.
74
Interfaces
operations: operations:
75
Interfaces
Herencia tambin se usa con interfaces Entonces nosotros decimos que un padre/base/super inteface es heredado/extendido por un hijo/derivado/subinterface Herencia jerarqua tambin se puede crear
Simple Herencia vs mltiple Herencia No hay problemas de colisin: ningn comportamiento (implementacin) est 76 asociada con las operaciones (ellas estn vacas)
Interfaces
Ejemplo (Java)
Java
Una interface es una coleccin de mtodos sin implementacin Una interface define un comportamiento que puede ser implementado por cualquier clase. Est prohibido crear objetos a partir de las intefaces La interface es una entidad completamente independiente de cualquier implementacin potencial.
77
Interfaces
Ejemplo (Java)
Java
78
Interfaces
Ejemplo (Java)
Java
En una interface, todos los mtodos son pblicos por defecto (no hay necesidad de declararlos como public) En una interface podemos definir constantes Todas las constantes son pblicas por defecto (no hay necesidad de declararlas como public)
79
Interfaces
Ejemplo (Java)
Java
public interface Calculator { double PI = 3,2426; double add(double a, double b); double substract(double a, double b); double multiply(double a, double b); double divide(double a, double b); }
80
Interfaces
Ejemplo (Java)
Java
Una clase puede implementar cualquier nmero de interfaces. Si una clase implementa una interface, debe proporcionar implementaciones para lo mtodos definidos en la interface. La interface es un contrato que debe ser cumplido por las clases que la implementan. Si conocemos la interface que un clase particular implementa es muy simple deducir su funcionamiento.
81
Interfaces
Ejemplo (Java)
Java
implements
CalculatorImpl CalculatorImpl attributes: attributes:
operations: operations:
Interfaces
Ejemplo (Java)
Java
Java soporta Herencia mltiple con interfaces (recordar que slo Herencia simple es soportada con clases).
public interface B { public void m1(); public void m2(); } public interface C extends A, B { public void m3(); }
public class MyClass implements C { public void m1() { ... } public void m2() { ... } public void m3() { ... } }
83
Interfaces
Ejemplo (C++)
C++
C++ no soporta nativamente el concepto de interface. En su lugar soporta el concepto de 'clase abstracta'. Si todos lo mtodos de una clase abstracta son puro virtual (abstracto), entonces la clase parecera una interface.
class Calculator { public: virtual double add(double,double) = 0; virtual double substract(double,double) = 0; virtual double multiply(double,double) = 0; virtual double divide(double,double) = 0; }
84
Interfaces
Ejemplo (C++)
class CalculatorImpl: Calculator { public: double add(double,double); double substract(double,double); double multiply(double,double); double divide(double,double); } double CalculatorImpl::add(double a, double b) { return a+b; } double CalculatorImpl::substract(double a, double b) { return a-b; } double CalculatorImpl::multiply(double a, double b) { return a*b; } double CalculatorImpl::divide(double a, double b) { return a/b; }
85
C++
Polimorfismo
Polimorfismo significa muchas formas
Es una caracterstica que permite valores de tipos de datos diferentes (y que tiene diferentes comportamientos) a ser tratadas utilizando una interfaz uniforme
Una operacin puede ser polimrfica con respecto a uno o varios argumentos. Ejemplo: el operador + puede ser aplicado a valores de diferentes tipos como enteros, reales... Un tipo de datos puede ser polimrfico respecto a los tipos de elementos que contiene. Ejemplo: Una lista con los elementos que pertenecen a tipos arbitrarios..
86
Polimorfismo
Clases de Polimorfismo
Ad-Hoc o evidente Polimorfismo: trabaja con un nmero finito de tipos de datos diferentes y sin relacin potencial
Sobrecarga Coaccin
87
Polimorfismo
Clases Polimorfismo
Universal o real Polimorfismo: trabaja con un nmero infinito de tipos de datos donde hay una estructura comn.
Polimorfismo
Sobrecarga (Overloading)
Una operacin con el mismo nombre tiene una variedad de definiciones Ejemplo: el operador + denota diferentes funciones, con diferentes implementaciones, dependiendo del tipo de argumentos (enteros, reales etc)
89
Polimorfismo
Sobrecarga (Overloading). Ejemplo (Java)
Java
Java soporta la sobrecarga de mtodos, siempre que tengan diferente nmero y tipo de argumentos.
public class Calculator { public double add(double a, double b){ ... } public int add(int a, int b){ ... } public float add(float a, float b){ ... } }
... int i = 10, j = 10; Calculator c = new Calculator(); c.add(i, j); ...
90
Polimorfismo
Sobrecarga. Ejemplo (Java)
Java
El lenguaje sobrecarga operadores matemticos, el operador + est sobrecargado para concatenar cadenas.
91
Polimorfismo
Sobrecarga. Ejemplo (C#)
C#
Los mtodos soportan la sobrecarga como en Java Los operadores soportan sobrecarga
public class Matrix { public static Matrix operator *(Matrix m1, Matrix m2) { ... } public static Matrix operator +(Matrix m1, Matrix m2) { ... } public static Matrix operator -(Matrix m1, Matrix m2) { ... } }
... int i = 10; int j = 10; int r = i * j; ... Matrix m1 = new Matrix(); Matrix m2 = new Matrix(); Matrix m3 = m1 * m2; ...
92
Polimorfismo
Coaccin
Conversin (implcita o explicita) de un tipo de argumento en otro. Implcita : Normalmente usado en combinacin con una jerarqua de tipos. Ejemplo: nosotros encontramos coaccin en operadores aritmticos entre valores enteros y reales en muchos lenguajes.
Polimorfismo
Coaccin. Ejemplo (Java)
Java
Coaccin Implcita
int i = 10; double j = 10.0; double r = i + j; // variable i es implcitamente convertida a double int error = i + j; // error; requiere coaccin explicita String a = i have ; int count = 10; String c = a + count + apples; // la variable count es implicitamente convertida a String
String a = hello, ; Calculator calc = new Calculator(); String c = a + calc; // el objeto Calculator es implicitamente convertido a String por la llamada // de mtodo String()
94
Polimorfismo
Coaccin. Ejemplo (Java)
Java
Explicita (cast)
int i = 10; double j = 10.0; int r = (int)(i + j); // el resultado (a double) es explcitamente convertido a int
95
Polimorfismo
Herencia (Polimorfismo inclusin)
La misma variable puede contener objetos de diferentes tipos, siempre que estos objetos pertenezcan a una inclusin comn. El resultado es la misma variable que se comporta de maneras diferentes ante los mismas operaciones (polimorfismo). Este concepto se aplica tanto a clases como a interfaces.
96
Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (Java)
Java
Circle draw()
Square draw()
shp2.draw(); /* bibujar un crculo (circle)*/ shp2 = new Square(); shp2.draw(); /* dibujar un cuadrado (square) */
97
Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (Java)
Java
<<implements>>
<<implements>>
CircleImpl draw()
SquareImpl draw()
98
Polimorfismo
Java
Una variable es polimrfica cuando su declaracin de tipo (tipo esttico) no coincide con el tipo de objeto referenciado (tipo dinmico). El operador instanceof ayuda a determinar el tipo dinmico de la variable:
if (shp instanceof Circle) {...}
Para convertir una referencia del tipo base (Shape) a una referencia de tipo derivada (Circle) es requerida una conversin explcita (casting) :
if (shp instanceof Circle) { Circle circ = (Circle)shp; }
99
Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)
C#
En C#, podemos definir un mtodo virtual usando la clave 'virtual' Un mtodo virtual es un mtodo Polimrfico El se puede redefinir con nuevos valores en una subclase usando la palabra reservada 'override' Cuando el mtodo no era virtual se debe usar la palabra new
100
Polimorfismo
Herencia ( Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }
C#
Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }
C#
La salida es:
Animal a1 = new Animal(); a1.habla(); a1.canta(); a1.saluda();
Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }
C#
Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }
C#
La salida es:
Animal a2 = new Perro(); a2.habla(); a2.canta(); a2.saluda();
Animal constructor Perro constructor Animal habla Perro canta Animal dice Hola 104
Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }
C#
Polimorfismo
Herencia (Polimorfismo inclusin). Ejemplo (C#)
class Animal { public Animal() { Console.WriteL ine(Animal constructor); } public void saluda() { Console.WriteL ine(Animal dice Hola} public void habla() { Console.WriteL ine(Animal habla); } public virtual void canta() { Console.WriteL ine(Animal canta); } } class Perro: Animal { public Perro() { Console.WriteL ine(Perro constructor); } public new habla() { Console.WriteL ine(Perro habla); } public override void canta() { Console.WriteL ine(Perro canta); } }
C#
La salida es:
Perro d = new Perro(); d.habla(); d.canta(); d.saluda();
Animal constructor Perro constructor Perro habla Perro canta Animal dice Hola 106
Polimorfismo
Genricos (Polimorfismo Universal)
Soluciona el problema de la aplicacin de algoritmos y estructuras de datos genericas . Genrico significa que soporta diferentes tipos de datos. La misma estructura puede trabajar con diferentes tipos de datos de una forma homognea.
107
Polimorfismo
Java
Antes del JDK 1.5, Java no soportaba genricos La Generacidad fue simulada aprovechando el java.lang.Object Como todas las clases se extienden, entonces una variable de objeto puede contener una referencia a cualquier tipo de datos.
Object obj = new Integer(5);
Ms tarde, necesitamos hacer multiples conversiones explicitas (castings) para obtener el tipo de datos original
Integer n = (Integer)obj;
108
Polimorfismo
Genricos (Polimorfismo universal). Ejemplo (Java)
Java
109
Polimorfismo
Java
Desde JDK .5 soporta genricos La generacidad permite usar tipos de datos como parmetros Ventajas:
Los Errores pueden ser detectados en tiempo de compilacin No usaremos conversiones explcitas Los Errores disminuyen y aumenta el rendimiento
110
Polimorfismo
Java
El valor del parmetro T puede ser una clase o interface (pero nunca un tipo primitivo). Cuando un objeto de tipo Box es declarado necesitamos especificar el tipo del parmetro T.
Box <Integer> b = new Box <Integer>();
111
Polimorfismo
Java
Ejemplo de uso
public static void main(String[] args) { B ox<Integer> b = new B ox<Integer>(); b.set(new Integer(46)); Integer n = b.get();
112
Polimorfismo
Java
En Java, podemos encontrar una gran cantidad de clases genricas. La mayoria de ellas implementadas en colecciones (in java.util) Ejemplo: ArrayList, implementacin de una matriz de tamao variable
packake java.util; public class ArrayL ist <E > { public ArrayL ist(); public boolean add(E element); public E set(int index, E element); public E get(int index); public E remove(int index); public int size();
113
Polimorfismo
Java
A veces tenemos que restringir el tipo de parmetros genricos . Nostros usamos extends. Ejemplo: en el parking slo hay vehculos aparcados.
public class Parking <V extends Vehicle> { private int numPlaces; private ArrayL ist<V> places; public Parking(int numPlaces) { this.numPlaces = numPlaces; places = new ArrayL ist<V>(numPlaces); }
114
Polimorfismo
Genricos (Polimorfismo Universal). Ejemplo (Java)
Java
Nosotros podemos definir Mtodos Genricos (no clases). Ejemplo: Mostrar el contenido de una lista ArrayList
public class OperationsArray { public static <T> void showArray(ArrayL ist<T> a) { for (int i = 0; i < a.size(); i++) System.out.println(a.get(i).toString()); } }
Este parmetro colo puede ser usado dentro del Mtodo donde se ha definido
115
Polimorfismo
Generics (universal Polimorfismo). Ejemplo (Java)
Java
si es < x si es > x
== 0, si es = x
116
Polimorfismo
Java
Ejemplo: usando genricos, nosotros implementamos la comparacin para el mtodo de la clase Figure.
public abstract class Figure implements Comparable<Figure> { ... public int compareTo(Figure f) { if (this.area() < f.area()) return -1; else if (this.area() > f.area()) return 1; else return 0; } ...
117
Excepciones
Este es el principal mecanismo de manejo de errores del paradigma orientado a objetos. Cuando un programa es ejecutado, pueden sufrir algunas situaciones imprevistas. Nosotros las llamamos Excepciones. El programa debe detectarlas y cambiarlas para resolverlas. La rutina que resuelve el problema es lo que se llama manejador de excepciones. Cuando se genera un excepcin la ejecucin normal del programa es interrumpida y es buscado el manejador de excepciones adecuado. Si se encuentra , el manejador de excepcin toma 118 el control.
Excepciones
Ejemplo (Java)
Java
No recuperables o errors: bajo nivel, normalmente afectan al hardware, fallo de memoria, etc. Recuperables o Excepciones: el resto de situaciones.
119
Excepciones
Ejemplo (Java)
Java
Throwable Las Excepciones deben controlarse Exception IOException I/O error NullPointerException User Excepciones Error lgico de programa
Ex.: divisin x cero Ex.: indice fuera de rango Ex.: usa una referencia 120 nula
Excepciones
Ejemplo (Java)
Java
Una excepcin normalmente contiene un mensaje con la descripcin del problema El mensaje se puede obtener invocando al mtodo getMessage(), heredado de la clase Throwable.
121
Excepciones
Ejemplo (Java)
Java
Cuando un error o excepcin surge , se crea un objeto de la clase correspondiente . Este objeto contiene informacin sobre el problema y la ejecucin del programa es interrumpida, lanzando tal excepcin Se produce una excepcin mediante la instruccin throw.
UserE xception exc = new UserE xception(); throw exc; /* abbreviated */ throw new UserE xception(Something);
122
Excepciones
Ejemplo (Java)
Java
Propagar la excepcin a cualquiera , para ser gestionada por otro, (pasar la patata caliente). O controlar/atrapar la excepcin con un manejador de excepciones.
Cuando se invoca un mtodo que provoca una excepcin, el cdigo que lo invoc tiene las dos mismas opciones : propagar o atacar la excepcin.
123
Excepciones
Ejemplo (Java)
Java
Cuando un mtodo propaga una excepcin, el debe ser declarado como explcito en el prototipo del mtodo con throws.
public void propagateTheE xception() throws UserE xception { throw new UserE xception(); } public void propagateTheE xcepciones(int cod) throws E xception1, E xception2 { switch (cod) { case 1: throw new E xception1(); case 2: throw new E xception2(); } }
124
Excepciones
Ejemplo (Java)
Java
Con el fin de controlar/ atacar la excepcin, se debe definir un manejador de excepciones try-catch-finally
public static void main (String[] args) { try { Dentro del try colocamos el cdigo que podra lanzar Excepciones Dentro del catch , en caso de excepcin se controla canThrowE xception(); } catch (ThrownE xception exc) { System.out.println(E rror message: + exc.getMessage()); exc.printStackTrace(); } finally { } }
125
Excepciones
Ejemplo (Java)
Java
El bloque catch puede ser reproducido tantas veces como excepciones hayan en el cdigo.
try { mayThrowE xception1(); mayThrowE xception2() } catch (E xception1 e1) { System.out.println(E rror message: + e1.getMessage()); e1.printStackTrace(); } catch (E xception2 e2) { System.out.println(E rror message: + e2.getMessage()); e2.printStackTrace(); }
126
Excepciones
Ejemplo (Java)
Java
El bloque catch soporta Herencia para identificar el tipo de excepcin. La mayora de excepciones son manejadas al final.
try { mayThrowSeveralE xcepciones(); } catch (E xception e) { e.printStackTrace(); } catch (Throwable thr) { thr.printStackTrace(); }
127