Introduccin a la Programacin Orientada a Objetos Encapsulamiento
Introducción a la Programación Orientada a Objetos Encapsulamiento y Abstracción Departamento de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR 2019 IPOO 2 cuatrimestre 2019 Sonia Rueda
Encapsulamiento El encapsulamiento es un mecanismo que permite la definición de módulos de software que pueden ser utilizados como “cajas negras”, esto es, sabiendo qué hacen sin saber cómo lo hacen. Cada módulo de software tienen una interfaz que le permite comunicarse con los demás módulos del sistema. Un sistema complejo se construye a partir de módulos que se comunican a través de su interfaz.
Encapsulamiento en la POO Un sistema orientado a objetos está conformado por una colección de clases relacionadas entre sí. Algunas de las clases son proveedoras de servicios usados por otras clases clientes. Cada clase es un módulo de software que muestra su interfaz y esconde su implementación. La interfaz está constituida por la signatura de los servicios.
Encapsulamiento en Java En Java el programador de una clase establece el nivel de encapsulamiento usando los modificadores de acceso. Los constructores, comandos y consultas especificados por el diseñador en el diagrama, se declaran como públicos y son visibles para las clases clientes. Los atributos se declaran como privados y quedan encapsulados en la clase, de modo que puedan ser modificados sin provocar un impacto en el resto de las clases que conforman el sistema.
Caso de Estudio: Punto <<atributos de instancia>> x, y: real <<Constructores>> Punto(x, y: real) <<Comandos>> establecer. X(x: real) establecer. Y(y: real) copy (p: Punto) <<Consultas>> obtener. X(): real obtener. Y(): real equals(p: Punto): boolean distancia(p: Punto): real clone(): Punto to. String(): String copy (p: Punto) Requiere p ligado equals(p: Punto): boolean Requiere p ligado distancia(p: Punto): real Requiere p ligado. La distancia entre dos puntos se calcula aplicando Pitágoras
Caso de Estudio: Punto <<atributos de instancia>> x, y: real <<Constructores>> Punto(x, y: real) class Punto{ //Atributos de Instancia private float x, y; //Constructores public Punto (float x, float y){ this. x = x; this. y = y; }
Caso de Estudio: Punto <<atributos de instancia>> x, y: real <<Comandos>> establecer. X(x: real) establecer. Y(y: real) copy (p: Punto) Requiere p ligado public void establecer. X (float x){ this. x = x; } public void establecer. Y (float y){ this. y = y; } public void copy (Punto p){ //requiere p ligado x = p. obtener. X(); y = p. obtener. Y(); }
Caso de Estudio: Punto <<atributos de instancia>> x, y: real <<Consultas>> obtener. X(): real obtener. Y(): real //Consultas public float obtener. X(){ return x; } public float obtener. Y(){ return y; }
Caso de Estudio: Punto <<atributos de instancia>> x, y: real distancia(p: Punto): real Requiere p ligado. La distancia entre dos puntos se calcula aplicando Pitágoras <<Consultas>> … distancia(p: Punto): real p 2 (x 2, y 2) y y 2 y 1 dy=y 2 -y 1 p 1 (x 1, y 1) dx=x 2 -x 1 x 2 x
Caso de Estudio: Punto public double distancia(Punto p) { //Requiere p ligado float dx= x - p. obtener. X(); float dy= y - p. obtener. Y(); return Math. sqrt(dx*dx+dy*dy); } p 2 (x 2, y 2) y y 2 y 1 dy=y 2 -y 1 p 1 (x 1, y 1) dx=x 2 -x 1 x 2 x
Caso de Estudio: Punto <<atributos de instancia>> x, y: real <<Consultas>> … equals(p: Punto): boolean clone(): Punto to. String(): String equals(p: Punto): boolean Requiere p ligado public boolean equals (Punto p){ //Requiere p ligado return x==p. obtener. X() && y==p. obtener. Y(); } public Punto clone(){ return new Punto(x, y); } public String to. String(){ return "("+x+", "+y+")"; }
Caso de Estudio: Punto class Figura{ … public void test(){ Punto p 1, p 2, p 3; p 1=new Punto(1, 2); p 2=new Punto(1, 2); p 3 = p 1 ; if (p 3. equals(p 1)) System. out. println("p 3 if (p 3. equals(p 2)) System. out. println("p 3 p 3. establecer. X(0); if (p 3. equals(p 1)) System. out. println("p 3 if (p 3. equals(p 2)) System. out. println("p 3 } } igual a p 1"); igual a p 2");
Caso de Estudio: Punto class Figura{ … public void test(){ Punto p 1, p 2, p 3; p 1=new Punto(1, 2); p 2=new Punto(1, 2); p 3 = p 1. clone(); if (p 3. equals(p 1)) System. out. println("p 3 if (p 3. equals(p 2)) System. out. println("p 3 p 3. establecer. X(0); if (p 3. equals(p 1)) System. out. println("p 3 if (p 3. equals(p 2)) System. out. println("p 3 } } igual a p 1"); igual a p 2");
Caso de Estudio: Punto class Punto{ //Atributos de Instancia private float x, y; //Constructores public Punto (float x, float y){ this. x = x; this. y = y; } public void establecer. X (float x){ this. x = x; } public void establecer. Y (float y){ this. y = y; } public void copy (Punto p){ //Requiere p ligado x = p. obtener. X(); y = p. obtener. Y(); }
Caso de Estudio: Punto //Consultas public float obtener. X(){ return x; } public float obtener. Y(){ return y; } public boolean equals (Punto p){ //Requiere p ligado return x==p. obtener. X() && y==p. obtener. Y(); } public Punto clone(){ return new Punto(x, y); } public String to. String(){ return "("+x+", "+y+")"; } }
Caso de Estudio: Recta y Punto Recta <<atributos de instancia>> p 1: Punto p 2: Punto <<Constructores>> Recta(p 1, p 2: Punto) <<Comandos>> copy. S (l: Recta) copy. P (l: Recta) <<Consultas>> obtener. P 1(): Punto obtener. P 2(): Punto equals. S(l: Recta): boolean clone. S(): Recta equals. P(l: Recta): boolean clone. P(): Recta longitud(): real mayor. Longitud(l: Recta): boolean to. String(): String Punto <<atributos de instancia>> x, y: real <<Constructores>> Punto (X, Y: real) <<Comandos>> copy (p: Punto) establecer. X(x: real) establecer. Y(y: real) <<Consultas>> obtener. X(): real obtener. Y(): real equals(p: Punto): boolean clone(): Punto to. String(): String distancia(p: Punto): real
Caso de Estudio: Recta y Punto Las clases Recta y Punto están relacionadas por asociación. La clase Recta tiene dos atributos de clase Punto. Existe también una relación de dependencia entre Recta y Punto. El constructor de Recta recibe dos parámetros de clase Punto. La clase Recta usa los servicios provistos por la clase Punto conociendo su interfaz, su funcionalidad y sus responsabilidades, no su implementación. La clase Punto se diseña, implementa y verifica sin saber que va a ser usada por la clase Recta.
Caso de Estudio: Recta y Punto class test{ public static void main (String arg[]){ Punto x 1, x 2, x 3, x 4, x 5; Recta l 1, l 2, l 3, l 4, l 5, l 6; x 1 x 2 x 3 x 4 x 5 l 1 l 2 l 3 l 4 …. = = = = = new Punto (-1, 2); x 1; x 1. clone(); new Punto (-1, 5); new Recta (x 1, x 5); new Recta (x 2, x 5); new Recta (x 3, x 5); new Recta (x 4, x 5);
Caso de Estudio: Recta y Punto class test{ public static void main (String arg[]){ l 5 = l 1. clone. S(); l 1 l 2 : Recta p 1: p 2: l 3 l 6 x: -1 y: 2 : Punto x: -1 y: 5 l 4 l 5 : Punto : Recta p 1: p 2: x 1 x 2 x 3 x 4 x 5
Caso de Estudio: Recta y Punto class test{ public static void main (String arg[]){ l 5 = l 1. clone. S(); l 6 = l 1. clone. P();
Caso de Estudio: Recta y Punto class test{ public static void main (String arg[]){ l 5 = l 1. clone. S(); l 6 = l 1. clone. P(); System. out. println(l 1. equals. S(l 2)); System. out. println(l 1. equals. S(l 3)); System. out. println(l 1. equals. S(l 4)); System. out. println(l 1. equals. S(l 5)); System. out. println(l 1. equals. S(l 6)); System. out. println(l 1. equals. P(l 2)); System. out. println(l 1. equals. P(l 3)); System. out. println(l 1. equals. P(l 4)); System. out. println(l 1. equals. P(l 5)); System. out. println(l 1. equals. P(l 6));
Caso de Estudio: Recta y Punto class test{ public static void main (String arg[]){ l 5. copy. S(l 1); l 6. copy. P(l 1); System. out. println(l 1. equals. S(l 5)); System. out. println(l 1. equals. S(l 6)); System. out. println(l 1. equals. P(l 5)); System. out. println(l 1. equals. P(l 6)); } }
Caso de Estudio: Recta y Punto class Recta{ //atributos de instancia private Punto p 1, p 2; //servicios public Recta(Punto p 1, Punto p 2){ this. p 1=p 1; this. p 2=p 2; } public Punto obtener. P 1(){ return p 1; } public Punto obtener. P 2(){ return p 2; }
Caso de Estudio: Recta y Punto public void copy. S(Recta l){ p 1=l. obtener. P 1(); p 2=l. obtener. P 2(); } public boolean equals. S(Recta l){ return ((p 1==l. obtener. P 1()) && (p 2==l. obtener. P 2())); } public Recta clone. S(){ return new Recta(p 1, p 2); }
Caso de Estudio: Recta y Punto public void copy. P(Recta l){ p 1. copy(l. obtener. P 1()); p 2. copy(l. obtener. P 2()); } public boolean equals. P(Recta l){ return ((p 1. equals(l. obtener. P 1())) &&(p 2. equals(l. obtener. P 2()))); } public Recta clone. P(){ return new Recta(p 1. clone(), p 2. clone()); }
Caso de Estudio: Recta y Punto public double longitud() { return p 1. distancia(p 2); } public boolean mayor. Longitud(Recta l) { return longitud() > l. longitud(); } public String to. String(){ return p 1. to. String()+ " "+p 2. to. String(); } }
Caso de Estudio: Recta y Punto
- Slides: 27