Object Oriented Programming Fundamentals (Spanish)

759 views

Published on

Presentation about generalities and techniques for Object Oriented Programming paradigm (OOP)

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
759
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Object Oriented Programming Fundamentals (Spanish)

  1. 1. Universidad de Costa RicaEscuela de Ciencias de la Computación e Informática Programación I (CI-1101)Programación Orientadaa Objetos (POO - OOP) Prof. Aníbal Gómez-Estrada Junio 2008
  2. 2. Motivación •  Surge por mantenibilidad y reutilización •  Mantenibilidad: ¿Cómo entender una rutina que use variables globales (static)? •  Reutilización: Encapsular las variables junto con las operaciónes que las accesan •  ¿El paradigma de programación más usado en la actualidad?Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  3. 3. Introducción •  Basado en conceptos de Clase y Objeto •  Clase: conjunto de objetos con propiedades y comportamiento similar •  Objeto: instancia de una clase capaz de procesar datos y recibir/enviar mensajes •  Clase ~ encapsulación •  Objeto = new Clase(); •  Objeto ~ referencia (dirección memoria)Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  4. 4. Introducción (2) •  Un Programa Orientado a Objetos: •  “simula” los objetos que intervienen en la realidad que modela •  Es conjunto de objetos que cooperan entre sí (NO rutinas ni tareas!) •  Es otra forma de pensar (y programar!)…Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  5. 5. Conceptos de POO •  Encapsulamiento (Atributos/Métodos y Clases) •  Herencía (Simple ó Múltiple) •  Polimorfismo (Herencia, Sobrecarga, Sobreescritura, Interfaces y Paramétrico) •  Es necesario entender POO para reutilizar todo lo que Java nos brinda…Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  6. 6. Encapsulamiento •  Ocultar datos y comportamiento. Controlar acceso a atributos y operaciones para: •  Asegurar consistencia en los datos •  Las clases “cliente” NO dependan de partes que pueden cambiar en el futuro ~ separar el ¿que? del ¿cómo? •  Peeero, ¿Cuáles miembros de un objeto o clase se pueden usar desde otras clases? •  Miembro = atributo ó método!Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  7. 7. Encapsulamiento (2) •  En encapsulamiento, la forma de reutilización de software es mediante asociación y composición •  Asociación: un objeto (instancia de una clase) tiene un miembro que referencia a un objeto de otra clase y al que puede enviarle mensajes •  Composición: es un tipo de asociación en donde el objeto referenciado SOLO existe mientras exista el objeto que lo referencia (el creador es responsable) •  Permite abstraer objetos complejos como relaciones entre objetos más sencillos. Estas relaciones se conocen como “tiene-un” (has-a)Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  8. 8. Encapsulamiento (3) •  En Java, el grado de encapsulamiento se especifica con modificadores de acceso. Usado al declarar miembros - •  private: el miembro sólo es visible en la misma clase •  “default” (sin modificador): private peero el miembro también es visible en clases del mismo package •  protected: “default” peero el miembro también es visible en las clases hijas •  public: miembro es visible en todo lado! +Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  9. 9. Encapsulamiento (4) •  Ver ejemplo de modificadores de acceso… •  Una clase también pueden declarar otras clases como miembros. Los modificadores de acceso también se usan sobre “clases miembro” (clase anidada) •  Como cualquier otro miembro, una clase anidada puede declararse como static o no ¿Qué significa static en una clase anidada?Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  10. 10. Encapsulamiento (5) class OuterClass { static class NestedClass {...} } •  Con static, un objeto se puede instanciar “desde todo lado” (bueno, si su modificador de acceso lo permite). OuterClass.NestedClass objeto = new OuterClass.NestedClass(); } •  Es decir, con static, un objeto es como cualquier otro y la clase SOLO sirve para encapsular!Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  11. 11. Encapsulamiento (6) class OuterClass { class InnerClass {...} } •  Si NO es static, se le llama clase interna (inner- class) y una instancia SOLO se puede crear dentro de un objeto existente de la clase que la encierra (enclosing-class). OuterClass objetoOuter = new OuterClass(); OuterClass.InnerClass objetoInner = objetoOuter.new InnerClass();Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  12. 12. Encapsulamiento (7) •  Si el objeto YA está siendo creado dentro de una instancia existente, JAVA asume esta instancia como el objetoOuter. class OuterClass { private int i; class InnerClass { public void goo(){ System.out.print(i); } public void foo(){ InnerClass objetoInner = new InnerClass(); } }Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  13. 13. Encapsulamiento (8) •  Pero ¿Para qué sirve una instancia sin static? •  Como un objetoInner existe dentro de la instancia que la crea (objetoOuter), tiene acceso a toooodos los miembros del objetoOuter (aún los private!). •  Mejor, ver ejemplo de clases anidadas J…Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  14. 14. Herencia •  Una clase (hija) puede heredar de otra clase (padre). ¿Pero que significa esto? •  Los miembros de la clase padre se "heredan" a las clases derivadas ~ es como si estuvieran declarados en las clases derivadas •  Clase base ~ clase padre o superclase •  Clase derivada ~ clase hija o subclase •  ¿Para que es útil?Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  15. 15. Herencia (2) •  En herencia, la forma de reutilización de software es mediante especialización. •  Especialización es cuando una clase “absorbe” (hereda) los miembros de una clase existente a la vez que agrega particulares. •  Permite “factorizar” miembros comunes en clases base reutilizables en clases derivadas, a través de relaciones de herencia. Estas relaciones se conocen como “es-un” (is-a)Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  16. 16. Herencia (3) class ParentClass { public int j = 8; public void getJ(){ return j; } } class ChildClass extends ParentClass { } ... ChildClass c = new ChildClass(); System.out.println( c.getJ() +“ ”+ c.j ); Ver Ejemplo…Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  17. 17. Herencia (4) •  Existen dos tipos de herencia: •  Herencia Simple: una clase hija SOLO puede tener UNA clase padre. •  Herencia Múltiple: una clase puede “heredar” de VARIAS clases padre •  Peero ¿Con Herencia Múltiple, qué hacer SI hay un miembro con el mismo nombre que viene heredado por 2 ó más padres? •  Veamos Un Ejemplo…Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  18. 18. Herencia (4) class ParentClassA { class ParentClassB { public int j = 8; public int j = 9; public void foo(){ public void foo(){ return “Hello!!”; return “Hola!!”; } } } } class ChildClass extends ParentClassA, ParentClassB { } ... ChildClass c = new ChildClass(); System.out.println( c.j +“ ”+ c.foo() ); ¿Escoger uno de los dos padres sería muy injusto, no? Es como que le dijeran a la mamá de uno: “Ud no le puede heredar el color de ojos a su bebe”…Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  19. 19. Herencia (5) •  En general, aunque podría ser útil, la Herencia Múltiple introduce problemas de ambigüedad. •  Es por esta razón que Java (y muchos otros lenguajes OO) NO la soportan. Pero, ofrecen formas de “simularla”… •  Profe, pero no vaya tan rápido!! •  Ok, veamos algunos otros conceptos de Herencia Simple que Java nos ofrece…Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  20. 20. Herencia (6) •  Una Clase Abstracta define un ancestro con datos y funcionalidad común pero que NO puede ser instanciado directamente.abstract class Animal { Coord posicion; class Humano extends Animal Animal(Coord pos ){ { this.posicion = pos; Humano( Cood pos, } boolean esHambriento ){ void dormir(int horas){...} super( pos ); void mover(){...} } void comer( Comida c ){ Comida masticar(Comida c){ digerir( masticar( c ) ); if ( ! esHambriento ){…} } } void digerir(Comida){ ... } void beber( Fresco f ){...} abstract Comida masticar(Comida c); }}Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  21. 21. Herencia (7) •  El modificador abstract especifica: •  En clase: que la clase NO puede instanciarse (aunque no defina métodos abstractos!). Es decir, la clase •  En método: que el método TIENE que ser implementado en las subclases (El método tiene que estar en una clase abstracta). •  Como cualquier clase, una clase abstracta puede heredar de cualquier otra clase (inclusive de otra clase abstracta!, ¿Qué significa esto?).Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  22. 22. Herencia (8) •  Una Clase Sellada (con modificador final) especifica que la clase NO puede ser heredada •  Pero ¿Para que es útil? •  Para Seguridad: que nadie interfiera en el estado interno del objeto (al heredar) y causar comportamientos no deseados. •  Por Diseño: que programador de la clase piense que NO tiene sentido que la hereden •  Ver Ejemplo de clase sellada…Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  23. 23. Polimorfismo •  En Griego ~ etimológicamente (muchas-formas): •  poly = muchas •  morphe = formas •  En POO ~ capacidad de tener formas distintas: •  De alguna forma, es algo que ya conocemos pero no con este nombre! •  Por otro lado, hay cosas que todavía no conocemos… •  ¿Un objeto/método tiene UNA SOLA forma?Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  24. 24. Polimorfismo (2) •  Java nos provee varios tipos: •  Polimorfismo por Herencia •  Polimorfismo por sobrecarga y sobreescritura •  Polimorfismo por Interfaces •  Polimorfismo Paramétrico (Generics) •  Pero, ¿Qué es polimorfismo? •  Profe, ¿Podés dejar de hablar tanta paja? •  Ok, a lo que vinimos…Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  25. 25. Polimorfismo Por Herencia •  En Java, si una función o variable acepta una clase particular, también acepta sus subclases: Animal animal1 = new Humano(); Animal animal2 = new Gato(); ... darleDeComer( animal1 ); darleDeComer( animal2 ); ... void darleDeComer( Animal animal ){ animal.comer( new Comida() ); } •  El método darleDeComer recibe cualquier tipo de animales (de muchas formas – polimorfismo) •  Pero, ¿Qué pasa si NO todos los Animales comen lo mismo?Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  26. 26. Polimorfismo Por Herencia (2) •  Java proporciona el operador instanceOf: void darleDeComer( Animal animal ){ if ( animal instanceOf Humano ){ animal.comer( new GalloPinto() ); } else { animal.comer( ... ); } •  ¿Y si necesito acceder un miembro particular de los SeresHumanos (ejemplo, método beber)? •  Java brinda el operador de conversión (casting):..if ( animal instanceOf Humano ){ TipoPequeno obj = ...; animal.comer( new GalloPinto() ); TipoGrande obj =(TipoGrande) obj ((Humano) animal).beber( … ); }.. /* OJO: TipoGrande TIENE QUE heredar de TipoPequeno */ Universidad de Costa Rica Programación I (CI-1101) Escuela de Ciencias de la Computación e Informática Junio 2008
  27. 27. Polimorfismo Por Herencia (3)Animal animal1 = new Humano(); /* De TipoGrande a TipoPequeño NO hayAnimal animal2 = new Gato(); conversión (Compilador la hace) */Humano humano = (Humano) animal1; /* OJO De TipoPequeño a TipoGrande SIGato gato = (Gato) animal2; Necesita conversión) */humano = (Humano) gato; /* ERROR DE COMPILADOR: Humano NO hereda de Gato */humano = (Humano) animal2; /* ERROR DE CASTING en RUNTIME: animal2 NO es un Humano */ •  Cuando existe un error en la conversión (que el compilador NO atrapó), se lanza la excepción java.lang.ClassCastException Universidad de Costa Rica Programación I (CI-1101) Escuela de Ciencias de la Computación e Informática Junio 2008
  28. 28. Polimorfismo Por Sobrecarga •  En Java, se permiten diferentes métodos con el mismo nombre pero diferentes parámetros… Humano humano = new Humano();void darleDeComer( Animal h ){ Gato gato = new Gato(); System.out.println( "ANIMAL" ); Animal animal1 = humano;} Animal animal2 = gato;void darleDeComer( Humano h ){ System.out.println( "HUMANO" ); darleDeComer( animal1 );} darleDeComer( animal2 );void darleDeComer( Gato g ){ System.out.println( "GATO" ); darleDeComer( humano );} darleDeComer( gato ); darleDeComer( (Humano) animal1 ); darleDeComer( (Gato) animal2 ); •  …Aquí el polimorfismo es a nivel de método pues toma “muchas formas de implementaciónUniversidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  29. 29. Polimorfismo Por Sobreescritura •  Este tipo es nuestro viejo amigo… •  Java permite re-implementar un método en una clase hija el cual fue definido originalmente en una clase padre class SerHumanoPerezoso extends SerHumano { @Override void dormir( int horas){ super.dormir( horas + 2 ); ... } } •  Como buena práctica, se debe llamar al método de la clase padre (super.metodo()) para no cambiar el comportamiento por defectoUniversidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  30. 30. Polimorfismo por Interfaces •  Una interface es la declaración de un “cascarón” que define los métodos que debe tener una clase que la implementa. class SerHumano extends Animalpublic interface Depredador { implements Depredador { void cazar( Victima v ); public void cazar(Victima v){...}} }public interface Victima { class Gato extends Animal void huir( Depredador d ); implements Depredador, Victima {} public void cazar(Victima v){...} public void huir(Depredador d){...} } •  Proveen el mecanismo “perfecto” para separar el ¿qué? del ¿cómo?. ¿Porqué?Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  31. 31. Polimorfismo por Interfaces (2) •  Son el caso general del concepto de clases y métodos abstractos. ¿Cuál es la diferencia? •  Una interface define un Tipo, de la misma forma que lo hace una clase. Es decir: •  Se pueden asignar variables y recibir parámetros del Tipo de una interface •  Se pueden heredar desde otras interfaces •  Peeero, una clase puede implementar VARIAS interfaces. ¿A qué se les parece esto?Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  32. 32. Polimorfismo por Interfaces (3) •  ¿Recuerdan nuestra amiga Herencia Múltiple? •  Pues SI, en Java las interfaces proveen un mecanismo para “simular” la Herencia Múltiple •  Pero, ¿Y los problemas de la Herencia Múltiple? •  Mejor, veamos ejemplos de Interfaces J…Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  33. 33. Conclusión •  Java y sus conceptos de POO nos brindan mecanismos eficaces y fáciles de usar para: •  Mantenibilidad: que el código sea fácil de entender y cambiar •  Reutilización: que el código sea reusable y extendible sin tener que repetirlo (copy/paste) •  Encapsulamiento (Atributos/Métodos y Clases) •  Herencía (Simple ó Múltiple) •  Polimorfismo (Herencia, Sobrecarga, Sobreescritura, Interfaces y Paramétrico)Universidad de Costa Rica Programación I (CI-1101)Escuela de Ciencias de la Computación e Informática Junio 2008
  34. 34. Universidad de Costa RicaEscuela de Ciencias de la Computación e Informática Programación I (CI-1101)Programación Orientadaa Objetos (POO - OOP) Aníbal Gómez Estrada Junio 2008

×