You are on page 1of 25

Tema 1.

Introduccin a la Programacin Orientada a Objetos


Autor: Miguel Toro Bonilla
Revisin: Jos C. Riquelme
1. Lenguajes de programacin
En este captulo vamos a dar una vista panormica a la programacin orientada a objeto y en
particular a la programacin usando el lenguaje Java. Muchos de los conceptos explicados en
este captulo los volveremos a ver ms detallados ms adelante
1.1. Conceptos bsicos de los Lenguajes de Programacin
Para construir programas necesitamos varios elementos de partida: identificadores, tipos y
declaraciones. Los identificadores son secuencias de caracteres que sirven para dar nombre a
una determinada entidad que el programa va a usar (variables, constantes, objetos, etc). Un
tipo es un conjunto de valores que una entidad puede tomar y las operaciones que podemos
hacer con esos valores. Mediante una declaracin decimos que se va a usar una entidad que
tiene como nombre un identificador dado y es del tipo indicado. Cada entidad declarada de un
tipo tendr, en un momento dado, un valor de ese tipo. Por ejemplo, dada una variable de tipo
entero, tomar valores enteros. Si una constante se define cadena de caracteres su valor ser
una cadena de caracteres, etc.
Asumimos que tenemos disponibles un conjunto de tipos que sern proporcionados por el
lenguaje de programacin que usemos. Entre ellos podemos destacar:

int, Integer, long, Long: Valores de tipo entero y sus operaciones. Ejemplo: 3

float, Float, double, Double: Valores de tipo real y sus operaciones: Ejemplo 4.5

boolean, Boolean: Valores de tipo lgico y sus operaciones: Sus valores posibles son
dos: true, false

String: Secuencias de caracteres y sus operaciones. Ejemplo: Hola.

char, Character: Caracteres de un alfabeto determinado: Ejemplo: d;

void, Void: Es un tipo que no tiene ningn valor

Los tipos numricos tienen las operaciones usuales. El tipo cadena tiene entre otras la
operacin de concatenacin que se representa en Java mediante el operador +.
Junto a los anteriores se pueden definir tipos nuevos mediante la clusula enum. Por ejemplo
el tipo Color podemos definirlo como:
public enum Color {
ROJO, NARANJA, AMARILLO, VERDE, AZUL, VIOLETA
}

Introduccin a la Programacin

Los tipos definidos de esta manera tienen los valores declarados. Los valores son: Color.ROJO,
Color.NARANJA, etc. Estos tipos tienen operaciones de igualdad y de orden. Los detalles
completos de los tipos anteriores (operadores disponibles, conjunto de valores,
representacin de las constantes) sern vistos ms adelante.
Ejemplo de declaracin de variables.
Integer edad;
Double peso;
String s1, s2;
Color c;

Aqu declaramos una nueva entidad (variable en este caso) edad es de tipo Integer y peso de
tipo Double. Las entidades s1 y s2 estn declaradas como String y c como Color.
Cada declaracin tiene un mbito. Por mbito de una declaracin entendemos el segmento
de programa donde esta declaracin tiene validez. Ms adelante iremos viendo los mbitos
asociados a cada declaracin. En la mayora de los casos un mbito est delimitado, en Java,
por los smbolos {} (llaves).
Las entidades que pueden cambiar el valor que almacenan las llamaremos variables y las que
no constantes.
Una expresin se forma con identificadores, valores constantes y operadores. Toda expresin
bien formada tiene asociado un valor y un tipo.
Ejemplo:
edad >= 30;
(2+peso)/3;
Color.ROJO;

La primera es de tipo boolean. La segunda de tipo Double. La tercera de tipo Color.


Mediante una asignacin (representada por =) podemos dar nuevos valores a una variable.
Por ejemplo:
Double precio;
precio = 4.5*peso + 34;

La asignacin es un operador que da el valor de la expresin de la derecha a la variable que


tiene a la izquierda. El operador = tiene siempre un sentido de derecha a izquierda y no
debemos confundirlo con el operador de igualdad que veremos ms adelante. La asignacin
funciona como si pusiramos variable expresin aunque se representa por el smbolo =.
Una expresin formada con un operador de asignacin tiene como tipo resultante el de la
variable de la izquierda y como valor resultante el valor asignado a esa variable (la de la
izquierda). La expresin: precio = 4.5*2 + 34; tiene como valor 43. y como tipo
Double.

La declaracin puede ser combinada con una asignacin. Como por ejemplo:

1. Introduccin a la Programacin Orientada a Objetos

Integer edad = 30;


Double peso = 46.5;
String s1 = Hola, s2 = Anterior;
Color c = Color.VERDE;

En este caso decimos que hemos declarado la variable y hemos hecho la inicializacin de la
misma. Es decir le hemos dado un valor inicial.
Las expresiones que escribamos deben estar bien formadas. Si no lo estn aparecern errores
que sern detectados cuando las escribimos. Son los denominados errores en modo de
compilacin. Las expresiones bien formadas pueden mostrar errores cuando intentamos
ejecutarlas. Son los denominados errores en tiempo de ejecucin. Por ejemplo la expresin
siguiente est bien formada, no produce errores en tiempo de compilacin, pero cuando se
intenta ejecutar se produce un error en tiempo de ejecucin. Esto es debido a que no se
puede hacer una divisin por cero.

int a;
a = 3*4/0;

Las expresiones se combinan en secuencias de expresiones. Como su nombre indica son


secuencias de expresiones acabadas en punto y coma (;).
2. Conceptos bsicos de Programacin Orientada a Objetos
Lenguajes Orientados a Objetos (LOO) son los que estn basados en la modelizacin mediante
objetos. Estos objetos tendrn la informacin y las capacidades necesarias para resolver los
problemas en que participen. Ejemplo: Una persona tiene un nombre, una fecha de
nacimiento, unos estudios, etc. Un vehculo tiene un dueo, una matrcula, una fecha de
matrcula, Un crculo tiene un centro y un radio, etc.
En el aprendizaje de la Programacin Orientada a Objetos (POO) usaremos el lenguaje Java
para concretar las ideas explicadas.
2.1. Programacin Orientada a Objetos
La POO (Programacin Orientada a Objetos) es una forma de construir programas de
ordenador donde las entidades principales son los objetos. Est basada en la forma que
tenemos los humanos de concebir objetos, distinguir unos de otros mediante sus propiedades
y asignarles funciones o capacidades. stas dependern de las propiedades que sean
relevantes para el problema que se quiere resolver.
Los elementos bsicos de la POO son:

Objeto

Introduccin a la Programacin

Interfaz
Clase
o Atributos (almacenan las propiedades)
o Mtodos (consultan o actualizan las propiedades)
Paquete

2.2. Objeto
Los objetos tienen unas propiedades, un estado y una funcionalidad asociada

Las propiedades son las caractersticas observables de un objeto desde el exterior del
mismo. Pueden ser de diversos tipos (nmeros enteros, reales, textos, booleanos,
etc.). Estas propiedades pueden estar ligadas unas a otras y pueden ser modificables
desde el exterior o no. Las propiedades de un objeto pueden ser bsicas y derivadas.
Son propiedades derivadas las que dependen de las dems. El resto son propiedades
bsicas o no derivadas.
El estado indica cul es el valor de sus propiedades en un momento dado.
La funcionalidad de un objeto se ofrece a travs de un conjunto de mtodos. Los
mtodos actan sobre el estado del objeto (pueden consultar o modificar las
propiedades) y son el mecanismo de comunicacin del objeto con el exterior.

Encapsulacin: Es un concepto clave en la POO y consiste en ocultar la forma en que se


almacena la informacin que determina el estado del objeto. Esto conlleva la obligacin de
que toda la interaccin con el objeto se haga a travs de ciertos mtodos implementados con
ese propsito (se trata de ocultar informacin irrelevante para quien utiliza el objeto). Las
propiedades de un objeto slo sern accesibles para consulta o modificacin a travs de sus
mtodos.
2.3. Interfaz (interface)
Es un elemento de la POO que permite, a priori, establecer cules son sus propiedades, qu se
puede hacer con un objeto de un determinado tipo, pero no se preocupa de saber cmo se
hace.
Cuando empezamos a pensar en un tipo nuevo de objeto debemos modelarlo. Para ello
estableceremos sus propiedades y cules se pueden modificar y cules no, debemos indicar
qu cosas puede hacer el objeto. Para ello definiremos un contrato que indique cmo es
posible interaccionar con el objeto. Ese contrato establece como se puede relacionar un
objeto con los dems que le rodean. Una parte del contrato se recoge en una interfaz.
Formalmente una interfaz (interface) contiene, principalmente, las signaturas de los mtodos
que nos permiten consultar y/o cambiar las propiedades de los objetos. Denominamos
signatura de un mtodo a su nombre, el nmero y el tipo de los parmetros que recibe y el
tipo que devuelve en su caso. Llamaremos a este tipo devuelto tipo de retorno. A la signatura
de un mtodo las llamaremos tambin cabecera del mtodo. Una tercera forma de denominar
la signatura es firma del mtodo.
Cada vez que declaramos un interfaz (interface) estamos declarando un tipo nuevo. Con este
tipo podemos declarar variables y con ellas construir expresiones.

1. Introduccin a la Programacin Orientada a Objetos

Para hacer el modelo de un objeto es conveniente seguir una metodologa para obtener una
interfaz adecuada para el tipo de objeto.
Una metodologa apropiada puede ser:
1. Establecer las propiedades relevantes que tiene el objeto. Las propiedades pueden
depender de parmetros.
2. Para cada propiedad indicar su tipo, si es consultable o no, posibles parmetros de los
que pueda depender.
3. Indicar las relaciones o ligaduras entre propiedades si las hubiera e indicar las
propiedades derivadas y no derivadas.
4. Indicar, en su caso, si la propiedad es compartida por todos los objetos del tipo.
5. Por cada propiedad consultable escribir un mtodo que comience por get y contine
con el nombre de la propiedad. Si la propiedad depende de parmetros este mtodo
tomar los parmetros de los que dependa y devolver valores del tipo de la
propiedad. Estos mtodos no modificarn el estado del objeto.
6. Por cada propiedad modificable escribir un mtodo que comience por set y contine
con el nombre de la propiedad. Este mtodo tomar al menos un parmetro con
valores del tipo de la propiedad y no devolver nada. Las propiedades derivadas no
son modificables.
7. Junto a las propiedades el tipo puede definir operaciones sobre el objeto. Una
operacin (que puede tener parmetros) es una forma de cambiar, desde fuera las
propiedades de un objeto. Por cada operacin escribiremos un mtodo que depender
de los mismos parmetros que la operacin.
Ejemplo:
Queremos modelar un objeto que llamaremos Punto (y que representar un punto del plano).
Para ello definiremos una interfaz que representa un contrato con los posibles usuarios del
objeto.
Punto:
Propiedades:
o X: Double, consultable y modificable
o Y: Double, consultable y modificable
En el lenguaje Java un interface se declara como en el ejemplo siguiente para el caso del
punto:
public interface Punto {
Double getX();
Double getY();
void setX(Double x1);
void setY(Double y1);
}

Para indicar que p representa un punto los indicaremos en Java por:

Introduccin a la Programacin

Punto p;

La variable p puede combinarse con los mtodos de la interfaz mediante el operador punto (.)
para formar expresiones. Estas expresiones, cuando estn bien formadas, tienen un tipo y un
valor. Desde otro punto de vista podemos decir que el mtodo ha sido invocado sobre el
objeto p.
p.setX(3);
p.setY(-4);

Las dos expresiones anteriores estn bien formadas porque p ha sido declarada de tipo Punto.
Ambas son de tipo void. Indican que los mtodos setX y setY han sido invocados sobre el
objeto p. Con ello conseguimos que las propiedades X e Y del objeto pasen a ser (3,-4). Ambas
son expresiones con efectos laterales porque al ser evaluadas cambia el estado del objeto.
P

?
?

3
-4

Si queremos consultar las propiedades de p:


p.getX();
p.getY();

Las dos anteriores son expresiones bien formadas. Ambas son de tipo Double y sus valores son
los valores de las propiedades X y Y, respectivamente, guardadas en el estado el objeto en un
momento dado. Otra forma de decirlo es: al invocar los mtodos getX() o getY() sobre una
entidad p de tipo Punto obtenemos valores de tipo Double. Estos son los valores de las
propiedades X e Y guardados en el estado de p. Las dos son expresiones sin efectos laterales
porque al ser evaluadas no cambia el estado del objeto.
Hay expresiones que no estn bien formadas. Cuando usamos el operador punto (.) la
expresin correspondiente slo est bien formada si el mtodo que est a la derecha del
punto es un mtodo del tipo con el que hemos declarado la variable. Hay un segundo requisito
para que la expresin est bien formada: los valores proporcionados como parmetros (que
denominaremos parmetros reales) deben ser del mismo tipo que los parmetros que tiene
declarados el mtodo correspondiente. Los parmetros declarados en un mtodo los
denominaremos parmetros formales.
Las expresiones siguientes no estn bien formadas.
p.getZ();
p.setU(4.1);
p.setX(4);

1. Introduccin a la Programacin Orientada a Objetos

La primera y la segunda no estn bien formadas porque los mtodos getZ, getU no estn
declarados en el tipo Punto (tipo de la variable p). La tercera tampoco est bien formada. En
este caso setX si es un mtodo de Punto pero el valor proporcionado no es de tipo Double.
Cuando definimos una interfaz estamos definiendo un tipo nuevo con el cual podemos
declarar nuevas entidades. A estas entidades declaradas de esta forma las llamaremos objetos.
Llamaremos objetos, en general, a las variables cuyos tipos vengan definidos por una interface
o una clase. Los objetos, las consultas a los mismos y en general la invocacin de alguno de sus
mtodos sobre un objeto pueden formar parte de expresiones.
Por ejemplo:
p.getX()*p.getX()+p.getY()+p.getY();

Es una expresin de tipo Double que calcula el cuadrado de la distancia del punto al origen de
coordenadas. El punto (.) es, por lo tanto un operador que combina un objeto con sus mtodos
y que indica que el correspondiente mtodo se ha invocado sobre el objeto. Despus del
operador punto (.) aparece el nombre del mtodo y cada parmetro formal (que aparecen en
la declaracin) es sustituido (en la invocacin) por una expresin que tiene el mismo tipo o
compatible. El conjunto de estas expresiones que sustituyen a los parmetros formales se
llaman parmetros reales. Una variable, el operador punto (.), un mtodo y sus
correspondientes parmetros reales forma una expresin. El tipo de esa expresin es el tipo
de retorno del mtodo.
Diseemos el tipo Punto de una forma ms general
Punto
Propiedades
o X, Real, Consultable, modificable
o Y, Real, Consultable, modificable
o Origen, Punto, Consultable, compartida
o DistanciaAlOrigen, Double, consultable, derivada
o DistanciaAOtroPunto(Punto p), Double, consultable, derivada
La interfaz asociada es:
public interface Punto {
Double getX();
Double getY();
void setX(Double x1);
void setY(Double y1);
Punto getOrigen();
Double getDistanciaAlOrigen();
Double getDistanciaAOtroPunto(Punto p);
}

Introduccin a la Programacin

Diseemos ahora el tipo Crculo.


Circulo:
Propiedades:
o Centro: Punto, consultable y modificable
o Radio: Double, consultable y modificable
o Area: Double, consultable, derivada de Radio
o Longitud: Double, consultable, derivada de Radio
Operaciones
o MoverElCentroAlOrigen, mueve el centro del crculo al origen de coordenadas
La interfaz asociada es:
public interface Circulo {
Punto getCentro();
Double getRadio();
Double getArea();
Double getLongitud();
void setCentro(Punto p);
void setRadio(Double r);
void moverElCentroAlOrigen();
}

La sintaxis para declarar un interfaz responde al siguiente patrn:


[Modificadores] interface NombreInterfazHija extends NombreInterfacesPadres [,] {
[.]
[cabeceras de mtodos]
}
La clusula extends la estudiaremos ms adelante.
Como hemos dicho antes, llamamos parmetros formales a los parmetros que aparecen en el
mtodo en el momento de declararlo. Puede haber mtodos con el mismo nombre pero
diferente cabecera. Es lo que se denomina sobrecarga de mtodos. En Java en particular es
posible la sobrecarga de mtodos. Pero con una restriccin: no puede haber dos mtodos con
el mismo nombre, los mismos parmetros formales y distintos tipos devueltos. Esto es debido
a que en Java, en particular, dos mtodos son iguales si tienen el mismo nombre y los mismos
parmetros formales. Por lo tanto, en Java, para identificar un mtodo de forma nica
debemos indicar su nombre y sus parmetros formales.
Tipo definido por un interfaz
Como hemos visto arriba al declarar un interfaz estamos definiendo un tipo nuevo. Este tipo
tiene el mismo identificador que la interfaz y est formado por todos los mtodos declarados
en ella. Con ese nuevo tipo se pueden declarar objetos, construir nuevas expresiones y llevar a
cabo las asignaciones correspondientes. Por ejemplo si c es de tipo Circulo y x de tipo Double.

1. Introduccin a la Programacin Orientada a Objetos

La expresin siguiente est bien formada y el valor de la variable x es actualizado al valor de la


propiedad X contenida en el estado del centro del crculo.
x=c.getCentro().getX();

Como vemos cuando definimos un interfaz definimos un tipo nuevo. En general al definir un
tipo nuevo usamos otros tipos ya definidos. En este caso el tipo Punto usa el tipo Double ya
definido en Java. El tipo Circulo usa el tipo Double y el tipo Punto.
2.4. Clases
Las clases son las unidades de la POO que permiten definir los detalles del estado interno de
un objeto (mediante los atributos), calcular las propiedades de los objetos a partir de los
atributos e implementar las funcionalidades ofrecidas por los objetos (a travs de los
mtodos)
Normalmente para implementar una clase partimos de una o varias interfaces que un objeto
debe ofrecer y que han sido definidas previamente. En la clase se dan los detalles del estado y
de los mtodos. Decimos que la clase implementa (representado por la palabra implements) la
correspondiente interfaz (o conjunto de ellas).
Estructura de una clase
Para ir detallando la clase nos guiamos por la interfaz que implementa. Como convencin
haremos que el nombre de la clase que implementa una interface ser el mismo seguido de
Impl.
Atributos
Los atributos sirven para establecer los detalles del estado interno de los objetos. Son un
conjunto de variables, cada una de un tipo y con determinadas restricciones sobre su
visibilidad exterior.
Como una primera gua la clase tendr un atributo por cada propiedad no derivada de la
interfaz que implementa y del mismo tipo que esta propiedad. Aunque ms adelante
aprenderemos otras posibilidades restringiremos el acceso a los atributos para que slo sean
visibles desde dentro de la clase.
Ejemplo para definir los atributos de una clase que implemente el interfaz Punto:

private Double x = 0;
private Double y = 0;
private static Punto origen;

y para una que implemente el interface Circulo:

private Double radio;


private Punto centro;

10

Introduccin a la Programacin

Como regla general a los atributos les damos el mismo nombre, pero comenzando en
minscula, de la propiedad que almacenan. Solo definimos atributos para guardar los valores
de las propiedades que sean bsicas (compartidas o no). Las propiedades derivadas, es decir
aquellas que se pueden calcular a partir de otras, no tienen un atributo asociado en general
aunque ms adelante aprenderemos otras posibilidades.
Las propiedades compartidas son aquellas, que como indica su nombre, se comparten por
todos los objetos de un mismo tipo. Aunque ms adelante lo veremos con ms detalle por
ahora slo indicaremos que los atributos que guardan valores de propiedades compartidas
deben llevar el modificador static adems del tipo y la visibilidad.
La declaracin de un atributo tiene un mbito que va desde la declaracin hasta el fin de la
clase incluido el cuerpo de los mtodos.
La sintaxis para declarar los atributos responde al siguiente patrn:

[Modificadores] tipo Identificador [ = valor inicial ];

Donde private es un modificador que restringe la visibilidad de un atributo slo al interior de la


clase y static otro modificador que indica que el atributo y su correspondiente valor sern
compartidos por todos los objetos del tipo. Ms adelante aprenderemos otros modificadores
posibles. Un atributo puede tener, de forma opcional, un posible valor inicial.
Mtodos
Los mtodos son unidades de programa que indican la forma concreta de consultar o
modificar las propiedades de un objeto determinado. Un mtodo tiene dos partes: cabecera (o
signatura o firma) y cuerpo. La cabecera est formada por el nombre del mtodo, los
parmetros formales y sus tipos y el tipo que devuelve. Cada parmetro formal supone una
nueva declaracin cuyo mbito es el cuerpo del mtodo. El cuerpo est formado por
declaraciones, expresiones y otro cdigo necesario para indicar de forma concreta que hace el
mtodo. Las variables que se declaran dentro de un mtodo se denominan variables locales y
su mbito es desde la declaracin hasta el final del cuerpo del mtodo. En una interfaz slo
aparecen las cabeceras de los mtodos. En una clase deben aparecer la cabecera y el cuerpo.
Puede haber mtodos con el mismo nombre pero diferente cabecera. Pero como se indic en
la declaracin de interfaces no puede haber dos mtodos con el mismo nombre, los mismos
parmetros formales y distinto tipo de retorno.

La sintaxis para los mtodos corresponde al siguiente patrn:


[Modificadores] TipoDeRetorno nombreMtodo ( [parmetros formales] ) {
Cuerpo;
}
Hay dos tipos de mtodos: observadores y modificadores. Los mtodos observadores no
modifican el estado del objeto. Es decir no modifican los atributos. O lo que es lo mismo los

1. Introduccin a la Programacin Orientada a Objetos

atributos no pueden aparecer, dentro de su cuerpo, en la parte izquierda de una asignacin.


Normalmente sern mtodos observadores aquellos cuyo nombre empiece por get. Los
mtodos modificadores modifican el estado del objeto. Los atributos aparecen, dentro de su
cuerpo, en la parte izquierda de una asignacin. Normalmente todos los mtodos que
empiecen por set son modificadores.
Ejemplo de un mtodo modificador (setX) y otro consultor (getX).

public void setX(Double x1 ) {


x = x1;
}

public Double getX( ) {


return x;
}

Cabecera

} Cuerpo
Cabecera

} Cuerpo

Hay unos mtodos especiales que llamaremos mtodos constructores o simplemente


constructores. Son mtodos que tienen el mismo nombre que la correspondiente clase. Sirven
para crear objetos nuevos y establecer el estado inicial de los objetos creados. Ejemplos de
constructores de la clase PuntoImpl son:
public PuntoImpl (Double x1, Double y1) {
this.x=x1;
this.y=y1;
}
public PuntoImpl(){
this.x=0.;
this.y=0.;
}

Como vemos los dos mtodos constructores tienen el mismo nombre (que debe ser el de la
clase) pero diferente cabecera. Con todo lo anterior podemos construir una clase. La sintaxis
responde al siguiente patrn:

[Modificadores] class NombreClase [extends ...] [implements ...] {


[atributos]
[mtodos]
}
Ejemplo de clase que implementa Punto. Como convencin haremos que el nombre de la clase
que implementa una interface ser el mismo seguido de Impl.

11

12

Introduccin a la Programacin

public class PuntoImpl implements Punto {


private Double x;
private Double y;
private static Punto origen = new PuntoImpl();
public PuntoImpl (Double x1, Double y1) {
this.x=x1;
this.y=y1;
}
public PuntoImpl(){
this.x=0.;
this.y=0.;
}
public Double getX() { return x; }
public Double getY() { return y; }
public void setX(Double x1) { x=x1; }
public void setY(Double y1) { y=y1; }
public Punto getOrigen(){return origen;}
public static void setOrigen(Punto p){
origen=p;
}
public Double getDistanciaAlOrigen(){
return this.getDistanciaAOtroPunto(origen);
}
public Double getDistanciaAOtroPunto(Punto p){
Double dx = this.getX()-p.getX();
Double dy = this.getY()-p.getY();
return Math.sqrt(dx*dx+dy*dy);
}
public void aumentarCoordenadas(Double p){
this.x = this.x*(1+p);
this.y = this.y*(1+p);
}
public String toString() {
String s="("+this.getX()+","+ this.getY()+")";
return s;
}
}

La palabra this es una palabra reservada y representa el objeto que estamos implementando.
As this.x es el atributo x del objeto que estamos implementando. De la misma forma
this.getX() es el mtodo getX invocado sobre el objeto que estamos diseando y sin
embargo p.getX() es la invocacin del mtodo getX sobre el objeto p. Dentro del cuerpo de
una clase en la invocacin de un mtodo (o atributo) de la misma sobre el objeto this (el que
estamos diseando) podemos quitar, si no hay ambigedad, la palabra this. Por lo tanto, si no
hay ambigedad, las expresiones que estn en la misma lnea son equivalentes dentro de una
clase dada:

this.get(x) es equivalente a getX()


this.distanciaAOtroPunto(origen) es equivalente a distanciaAOtroPunto(origen)

1. Introduccin a la Programacin Orientada a Objetos

Con la palabra this y el operador punto podemos formar expresiones correctas dentro de una
clase.
Como los mtodos las clases tienen dos partes cabecera y cuerpo. La cabecera sigue el
siguiente patrn:
[Modificadores] class NombreClase [extends ...] [implements ...]
Que en este caso es:
public class PuntoImpl implements Punto

Indica que PuntoImpl implementa el contrato de la interfaz Punto (por lo que, al menos, hay
que programar todos los mtodos definidos en la interfaz Punto). La clausula extends ser
estudiada ms adelante.
Las clases, por ahora, llevarn el modificador de public. Es decir sern visibles desde cualquier
parte. La clusula implements indica que la clase implementa el interfaz Punto. Esto quiere
decir que la clase deben debe tener todos los mtodos especificados en el interfaz con las
misma cabecera y con un modificador public. Pero, como en este caso, la clase puede tener
ms mtodos. En este caso el mtodo toString(). La clase, adems, siempre tiene los
constructores que no aparecen en el interface.
El cuerpo de la clase est formado por los atributos y los mtodos. Sigue el esquema:
{
[atributos]
[mtodos]
}
Si una clase implementa una interfaz (interface) debe implementar (aadir el cuerpo al
mtodo) cada uno de los mtodos de esa interfaz y posiblemente algunos ms. En este caso la
clase implementa tambin los mtodos toString y moverAOtroPunto. El primero convierte el
objeto en una cadena de caracteres y el segundo cambia la posicin del punto para colocarlo
en la posicin dada por otro punto que se proporciona como parmetro.
Se observa cmo los modificadores de visibilidad de los atributos son privados (ningn
mtodo de otra clase puede acceder a ellos), mientras que los mtodos tienen visibilidad
pblica y pueden ser invocados desde cualquier otra clase. Las clases e interfaces tambin las
declaramos con visibilidad pblica. Ms adelante aprenderemos ms detalles sobre los
modificadores y disearemos mtodos y clases con otras visibilidades.
En una clase hay, segn hemos visto arriba, tres tipos de declaraciones: de atributos, de
parmetros formales y de variables locales. Cada una de ellas tiene un mbito y unas
restricciones.

13

14

Introduccin a la Programacin

Las declaraciones de atributos tienen como mbito desde su declaracin hasta el final de la
clase. No puede haber dos atributos con el mismo identificador.
Las declaraciones de parmetros formales o variables locales (las que se declaran dentro de los
cuerpos de los mtodos) tienen como mbito desde la declaracin hasta el final del cuerpo del
mtodo. No puede haber dos declaraciones de este tipo (parmetro formal o variable local)
con el mismo identificador en un mtodo dado. A su vez, una declaracin de parmetro formal
o variable local oculta a otra posible declaracin de un atributo con el mismo identificador.
Ocultar quiere decir que si hay un conflicto (un atributo y una variable local o un parmetro
formal con el mismo identificador) entonces nos estamos refiriendo a la variable local o al
parmetro formal.
Tipo definido por una clase
Como en el caso de la declaracin de una interface, cada vez que declaramos una nueva clase
declaramos un nuevo tipo que tiene el mismo nombre de la clase. Con ese nuevo tipo
podemos declarar nuevas entidades. A estas entidades declaradas de esta forma, como en el
caso de los interfaces, las llamaremos objetos. Con los objetos declarados podemos formar
expresiones. Las consultas a objetos son un caso particular de expresiones.
Los constructores de las clases sirven para construir nuevos objetos. El operador new delante
de un constructor forma una expresin del tipo declarado con la clase. Una clase entonces
define un tipo nuevo con el que podemos declarar objetos y construir expresiones con ellos.
Este tipo definido por una clase est formado por todos los mtodos pblicos de la clase.
Como
podemos
comprobar
el
tipo
PuntoImpl
incluye
un
mtodo
aumentarCoordenadas(Double) que no est incluido en el tipo (interfaz) Punto.
El nombre de la clase es un objeto especial que puede formar parte de expresiones. Mediante
el operador punto (.) podemos combinar el nombre de una clase con los mtodos pblicos de
la misma que estn etiquetados static para formar expresiones correctas. Un caso concreto es
la clase Math proporcionada en el API de Java. Tiene un mtodo etiquetado con static con
nombre sqrt() que calcula la raz cuadrada de su argumento. Por lo tanto de Math.sqrt(a) es
una expresin bien formada que devuelve un valor de tipo double que es la raz cuadrada de
parmetro que se le haya pasado.
Vemos, por lo tanto, que cuando diseamos una clase nueva definimos un tipo nuevo con el
mismo nombre de la clase. Con variables de ese tipo (objetos) y el operador punto (.) podemos
formar expresiones. Estas expresiones estarn bien formadas si tras el operador punto usamos
cualquier mtodo pblico de la clase aunque no se recomienda usar aquellos mtodos
pblicos etiquetados con static. Para los mtodos static recomendamos formar expresiones
con el nombre la de la clase, el operador punto (.) y el mtodo static de la clase.
En el ejemplo siguiente cada lnea representa una declaracin de una variable (atributo o
variable local segn los caso) posiblemente con su inicializacin o una expresin. Unas son
correctas y otras no.

1. Introduccin a la Programacin Orientada a Objetos

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

Punto p1 = new PuntoImpl()


PuntoImpl p2 = new PuntoImpl (2.1, 3.7);
Punto p3 = new PuntoImpl(-2.3, 7.8);
p2.aumentarCoordenadas(0.1);
p3.aumentarCoordenadas(0.1);
//incorrecta
PuntoImpl.setOrigen(p3);
Double x = Math.sqrt(2.0);
Double y = Math.sqrt(2);
//incorrecta
p1.getDistanciaAlOrigen();
p2.getZ();
// incorrecta

En 1, 2, 3 declaramos puntos y los inicializamos. Las expresiones 5, 9 y 10 son incorrectas. La 5


porque el mtodo aumentarCoordenadas(Double) no pertenece al tipo Punto aunque s al tipo
PuntoImpl por lo que la 4 si es correcta. La 8 porque el parmetro real es de tipo String y el
formal es de tipo Double. La 10 porque el tipo Punto no incluye el mtodo getZ().
Aunque explicaremos esto con detalle ms adelante, un objeto creado con uno de los
constructores de una clase puede ser asignado a una variable cuyo tipo puede ser el nombre
de la clase o alguno de los interfaces que implementa. Por eso la primera y tercera sentencias
son correctas adems de la segunda.
Finalmente en la sentencia 6, se invoca un mtodo esttico con el nombre de la clase, en vez
de con un objeto.
Clases de utilidad
En general es til agrupar mtodos reutilizables en clases para facilitar su uso. Aquellas clases
que agrupan mtodos reutilizables etiquetados con static las llamamos clases de utilidad.
Como ejemplo diseamos una clase de utilidad con un conjunto de mtodos reutilizables para
visualizar objetos en la consola. Java nos ofrece otras de este tipo como Math.
package test;
public class Test {
public static void mostrar(Object p) {
System.out.println("El objeto es: " + p);
}
public static void mostrar(String s, Object p) {
System.out.println(s + p);
}
}

Algunos detalles no vistos todava:

System.out.println(String s): Es un mtodo que muestra en la pantalla el contenido de


la cadena s.

System.out.println(s + p): Muestra en la consola la cadena s concatenada con p.


toString().

15

16

Introduccin a la Programacin

3. Paquete
Un paquete es una agrupacin de clases e interfaces que por las funciones que desempean
conviene mantener juntos. Un paquete es similar a una carpeta que contiene diferentes
ficheros. La sintaxis responde al siguiente patrn:
package nombre_del_paquete;
interface {

package nombre_del_paquete;
class {

}
Por lo tanto para indicar que una interface o una clase estn en un determinado paquete, su
declaracin, debe ir precedida por package nombre_del_paquete. En numerosas ocasiones
diferentes paquetes pueden contener clases (o interfaces) con el mismo nombre. Para
distinguir unas de otras se usa el nombre cualificado de la clase (o interface). Este nombre se
forma con el nombre del paquete seguido de un punto y el nombre de la clase:
nombreDePaquete.NombreDeLaClase. Un paquete (paquete1) puede estar dentro de otro
paquete (paquete2). Si dentro del paquete1 est clase con nombre NombreClase entonces su
nombre cualificado ser paquete2.paquete1.NombreClase. Cuando en un paquete queremos
usar las clases o interfaces de otro paquete se pone una clausula import despus de la lnea
package nombre_del_paquete.
Por ejemplo, para usar el tipo Punto en una clase Test del paquete test, se pondr una clausula
import punto.Punto; detrs de la lnea package test;
Si se van a usar varios tipos de un paquete en una clase se puede poner una sentencia:
import punto.*;
que importa todas las clases e interfaces del paquete punto.
4. Relaciones entre Interfaces y Clases: herencia, implementacin y uso. Grafo de tipos
La herencia es una propiedad por la que se establecen relaciones que podemos denominar
padre-hijo entre interfaces o entre clases. La herencia se representa mediante la clusula
extends.

1. Introduccin a la Programacin Orientada a Objetos

En Java la herencia entre interfaces puede ser mltiple: un hijo puede tener uno o varios
padres. La interfaz hija tiene todas las signaturas (mtodos) declaradas en los padres. No se
puede ocultar ninguna.
La sintaxis para interfaz responde al siguiente patrn:
[Modificadores] interface NombreInterfazHija extends NombreInterfacesPadres [,] {
[.]
[signatura de mtodos]
}
Mediante extends se indica que la interfaz que estamos definiendo combina otras interfaces
padres y, posiblemente, aade algunos mtodos ms. Cuando una interfaz extiende a otra
decimos que el tipo definido por la interface hija es un subtipo del tipo definido por la interfaz
padre.
Una clase puede heredar de otra clase. Esto se expresa mediante la clusula extends. En Java
una clase solo puede heredar de una sola clase padre. Una clase puede implementar varios
interfaces. Esto se implementa mediante la clusula implements.
La sintaxis para clase responde al siguiente patrn:
[Modificadores] class NombreClaseHija extends NombreClasePadre
[implements NombreInterfaz, ] {
[atributos ]
[mtodos ]
}
Mediante extends se indica que la clase que estamos definiendo hereda de otra clase padre.
La relacin de herencia entre clases indica que todos los mtodos pblicos (junto con su
cdigo) estn disponibles para la clase hija. Entre los mtodos pblicos se incluyen los
constructores pblicos. Ms adelante veremos que tambin estn disponibles los mtodos y
atributos con otras visibilidades.
En la clase hija se puede acceder a los mtodos de la clase padre mediante la palabra
reservada super. Con esta palabra reservada se pueden forma nuevas expresiones en el
cuerpo de una clase que hereda de otra. Las expresiones que se pueden formar se componen
de la palabra super y el operador punto (.) seguido de algunos de los mtodos de la clase
padre visibles en la clase hija. Por ahora los nicos mtodos visibles son los pblicos (public).
La palabra reservada super tambin sirve para acceder a los constructores de la clase padre
visibles desde la hija. En este caso super ir seguido de parntesis y una secuencia de
parmetros y representar la invocacin del correspondiente constructor de la clase padre. Es
decir el constructor de la clase padre, visible desde la hija y que tenga los parmetros que se
han proporcionado la tras la palabra super. Algunos ejemplos de expresiones de este tipo son:
super.m(2.);
..

17

18

Introduccin a la Programacin

super(2,3);
En la primera se invoca el mtodo m de la clase padre con parmetro 2. Y en la segunda se
invoca el constructor de la clase padre que tendr dos parmetros de tipo int.
Una clase slo puede heredar de otra clase nica pero puede implementar varias interfaces. La
relacin que se establece entre una clase y cada una de las interfaces que implementa la
llamaremos relacin de implementacin. La relacin de implementacin obliga a la clase a
implementar (proporcionar cdigo) a cada uno de los mtodos de la interfaz implementada.
Al igual que con interfaces, cuando una clase hereda de otra el tipo definido por la clase hija es
un subtipo del tipo definido por la clase padre. Entre tipos y subtipo hay una importante
propiedad. Sea una variable b es de un tipo B y otra a de otro tipo A. Si B es un subtipo de A
entonces la variable b puede ser asignada a la variable a pero no al revs.

A a;
B b;
a = b;
b = a;

// correcto
// incorrecto

Ejemplos concretos son:


A es un interface y B otro que hereda de l
A es una clase y B otra que hereda de ella
A es un interfaz y B una clase que lo implementa
Ejemplo
Ejemplo de herencia de interfaces: Pixel, Vector2D.
public enum Color {
ROJO, NARANJA, AMARILLO, VERDE, AZUL, VIOLETA
}
public interface Pixel extends Punto {
Color getColor();
void setColor(Color c);
}
public interface Vector2D extends Punto {
void diferencia(Vector2D v);
void suma (Vector2D v);
void multiplicaPor(Double d);
Double getProductoEscalar(Vector2D v);
Double getProductoCruzado(Vector2D v);
Double getModulo();
}

La interfaz Pixel hereda de Punto y aade una nueva propiedad consultable y modificable
denominada Color. El interfaz Vector2D hereda de Punto y aade las propiedades

1. Introduccin a la Programacin Orientada a Objetos

ProductoEscalar, ProductoCruzado y Modulo. Adems aade operaciones como diferencia,


suma y multiplicaPor.
Una vez que hemos diseado los tipos anteriores debemos implementarlos. La
implementacin del tipo Pixel la hacemos en la clase PixelImpl. Para implementar esta clase
reutilizamos la clase PuntoImpl heredando de ella. La implementacin de la clase Vector2DImpl
la dejamos como ejercicio teniendo en cuenta que dados dos vectores en dos dimensiones,
(
)(
), las diferentes propiedades y operaciones sobre ellos vienen definidas por:

) (
) (
Suma: (
) (
)
Diferencia: (
) (
MultiplicaPor: (
) (
ProductoEscalar: (
) (
ProductoCruzado: (

Modulo: (

)
(

)
)
)

(
)

)
(

public class PixelImpl extends PuntoImpl implements Pixel {


private Color color;
public PixelImpl () {
super();
this.color = Color.VERDE;
}
public PixelImpl (Double x, Double y, Color color) {
super(x,y);
this.color = color;
}
public Color getColor (){
return this.color;
}
public void setColor (Color color){
this.color=color;
}
public String toString(){
String s = super.toString();
s = s+"."+color;
return s;
}
}

Como podemos ver dentro del cuerpo de la clase PixelImpl se usan las palabras reservadas
super y this. La clase PixelIml debe implementar Pixel (es decir todos sus mtodos) pero para
ello reutiliza el cdigo ya disponible en PuntoImpl. Dentro del cdigo de PixelImpl (que hereda
de PuntoImpl) super.m(..) se refiere al mtodo m de la clase PuntoImpl. Igualmente super(x,y)
se refiere la constructor con dos parmetros Double de la clase PuntoImpl. Sin embargo
this.color se refiere al atributo color de la clase PixelImpl.
La clase Vector2Dimpl tendr la cabera
public class Vector2DImpl extends PuntoImpl implements Vector2D {}

19

20

Introduccin a la Programacin

El conjunto de tipos que hemos definido y las relaciones entre ellos son:

Punto

Pixel

PuntoImpl

Color

Vector2D
PixelImpl

Vector2DImpl

A este grafo lo llamaremos grafo de tipos. En este grafo representamos los tipos y sus
relaciones. Los tipos que aparecen definidos en el grafo de tipos son tipos definidos por una
interfaz, por una clase o por una declaracin enum. Hay representadas tres tipos de relaciones:

Herencia de clases
Herencia de interfaces
Implementacin de un interfaz por una clase

Hemos representado las relaciones de herencia (de clases o interfaces) con flechas continuas y
las de implementacin con flechas discontinuas.
El grafo de tipos nos permite visualizar rpidamente los tipos que hemos diseado y su
relacin de subtipado. De una forma general un tipo es subtipo de otro si hay un camino del
primero al segundo a travs de flechas de herencia o de implementacin. Si un tipo B es un
subtipo de A entonces decimos que A es un supertipo de B. El grafo de tipos es til, tambin,
para visualizar el conjunto de tipos ofrecidos por un objeto. El conjunto de tipos ofrecidos por
un objeto est formado por todos los supertipos del tipo asociado a la clase que cre el objeto.
As si creamos un objeto de la clase PixelImpl, ste ofrece los tipos: PixelImpl, Pixel, Punto,
PuntoImpl. En este conjunto siempre se aade un tipo proporcionado por Java y que es
ofrecido por todos los objetos. Es el tipo Object.
Junto a las anteriores relaciones entre los tipos hay una ms que no se suele representar en el
grafo de tipos. Es la relacin de uso. Un tipo A usa a otro B cuando declara algn parmetro
formal, tipo de retorno, atributo o variable local del tipo B. As por ejemplo el tipo Pixel usa
Color pero el tipo Punto no.

5. Estructura y funcionamiento de un Programa en Java


Un programa en Java est formado por un conjunto de declaraciones de tipos enumerados,
interfaces y clases. Un programa puede estar en dos modos distintos. En el modo de
compilacin est cuando estamos escribiendo las clases e interfaces. En este modo a medida
que vamos escribiendo el entorno va detectado si las expresiones que escribimos estn bien
formadas. Si el entorno no detecta errores entonces diremos que el programa ha compilado
bien y por lo tanto est listo para ser ejecutado. Se llama modo de compilacin porque el

1. Introduccin a la Programacin Orientada a Objetos

encargado de detectar los errores en nuestros programas, adems de preparar el programa


para poder ser ejecutado, es otro programa que denominamos comnmente compilador. En el
modo de ejecucin se est cuando queremos obtener los resultados de un programa que
hemos escrito previamente. Decimos que ejecutamos el programa. Para poder ejecutar un
programa ste debe haber compilado con xito previamente. En otro caso no lo podremos
ejecutar.
En el modo de ejecucin pueden aparecer nuevos errores. Los errores que pueden ser
detectados en el modo de compilacin y los que se detectan en el modo de ejecucin son
diferentes. Hablaremos de ellos ms adelante. Cuando queremos ejecutar un programa en
Java ste empieza a funcionar en la clase concreta elegida de entre las que tengan un mtodo
de nombre main. Es decir un programa Java empieza a ejecutarse por el mtodo main de una
clase seleccionada.
Las interfaces y clases diseadas ms arriba forman un programa. Necesitamos una que tenga
un mtodo main. En el ejemplo siguiente se presenta una que sirve para comprobar el buen
funcionamiento del tipo Punto. Reutiliza la clase previamente diseada Test.
package test;
import punto.*;
public class TestPunto extends Test{
public static void main(String[ ] args) {
Punto p= new PuntoImpl(2.0,3.0);
mostrar("Punto:", p);
p.setX(3.0);
mostrar("Punto:", p);
p.setY(2.0);
mostrar("Punto:", p);
}
}

El programa empieza a ejecutarse el mtodo main de la clase seleccionada que en este caso es
TestPunto. Esta ejecucin slo puede llevarse a cabo cuando han sido eliminados todos los
posibles errores en tiempo de compilacin y por lo tanto las expresiones estn bien formadas.
En la lnea
Punto p= new PuntoImpl(2.0,3.0);

Se declara p como un objeto de tipo Punto y se construye un objeto nuevo, con estado
(2.0,3.0), mediante un constructor de la clase PuntoImpl. El nuevo objeto construido es
asignado a p, por lo que p pasa a ser un objeto con estado (2.0,3.0).
En la lnea
p.setX(3.0);

se invoca al mtodo setX(Double X), con parmetro real 3.0, sobre el objeto p para modificar
en su estado la propiedad X al valor 3.

21

22

Introduccin a la Programacin

Los resultados esperados en la consola son:


Punto: (2.0,3.0)
Punto: (3.0,3.0)
Punto: (3.0,2.0)

Igualmente podemos disear la clase TestPuntoPixel que tambin reutiliza la clase Test y nos
va a servir para evaluar si el tipo Pixel funciona como esperamos.
package test;
import punto.*;
public class TestPixel

extends Test {

public static void main(String[ ] args) {


Punto p = new PuntoImpl(2.0,3.0);
mostrar("Punto: ", p);
mostrar("Distancia al origen: ",p.getDistanciaAlOrigen());
p.setX(3.);
p.setY(2.);
mostrar("Punto: ", p);
mostrar("Distancia al origen: ", p.getDistanciaAlOrigen());
Pixel p2 = new PixelImpl(1.0,1.0,Color.ROJO);
mostrar("Distancia al (1,1): ", p.getDistanciaAOtroPunto(p2));
mostrar("Pixel: ", p2);
}
}

Los resultados esperados en la consola son:


Punto: (2.0,3.0)
Distancia al origen: 3.605551
Punto: (3.0,2.0)
Distancia al origen: 3.605551
Distancia al (1,1): 2.236067
Pixel: (1.0,1.0),ROJO

6. Convenciones Java. Reglas de estilo


Razones para mantener convenciones:

El 80% del cdigo de un programa necesita de un posterior mantenimiento y/o


adaptacin a nuevas necesidades.
Casi ningn software es mantenido durante toda su vida por el autor original.
Las convenciones de cdigo mejoran la lectura del software, permitiendo entender el
cdigo nuevo mucho ms rpidamente y ms a fondo.
Si distribuyes tu cdigo fuente como un producto, necesitas asegurarte de que est
bien hecho y presentado como cualquier otro producto.

Reglas para nombrar interfaces y clases:

Los nombres de interfaces deben ser sustantivos.

1. Introduccin a la Programacin Orientada a Objetos

Cuando son compuestos tendrn la primera letra de cada palabra que lo forma en
maysculas.
Se deben mantener los nombres de interfaces simples y descriptivos.
Usar palabras completas, evitar acrnimos y abreviaturas (salvo que sta sea mucho
ms conocida que el nombre completo, como dni, url, html)
Las clases tendrn el nombre de la interfaz principal que implementan terminada en
Impl (Implementacin)
Si hay ms implementaciones se aadir Impl1, Impl2 o algn sufijo explicativo, p.e.
MatrizImplEnteros, MatrizImplPersona.

Reglas para nombrar mtodos, variables, constantes:

Cualquier nombre compuesto tendr la primera letra en minscula, y la primera letra


de las siguientes palabras en mayscula.
Los nombres no deben empezar por los caracteres "_" o "$", aunque ambos estn
permitidos por el lenguaje.
Los nombres deben ser cortos pero con significado, de forma que sean un
mnemnico, designado para indicar la funcin que realiza en el programa.
Deben evitarse nombres de variables de un solo carcter salvo para ndices
temporales, como son i, j, k, m, y n para enteros; c, d, y e para caracteres.
Las constantes se escriben con todas las letras en maysculas separando las palabras
con un guin bajo ("_")

7. Otros conceptos y ventajas de la POO


Para hacer programas sin errores es muy importante la facilidad de depuracin del entorno o
lenguaje con el que trabajemos. Despus de hechos los programas deben ser mantenidos. La
capacidad para mantener un programa est relacionada con el buen diseo de sus mdulos, la
encapsulacin de los conceptos relevantes, la posibilidad de reutilizacin y la cantidad de
software reutilizado y la comprensibilidad del mismo. Todas estas caractersticas son ms
fciles de conseguir usando lenguajes orientados a objetos y en particular Java.

Modularidad: Es la caracterstica por la cual un programa de ordenador est


compuesto de partes separadas a las que llamamos mdulos. La modularidad es una
caracterstica importante para la escalabilidad y comprensin de programas, adems
de ahorrar trabajo y tiempo en el desarrollo. En Java las unidades modulares son
fundamentalmente las clases que se pueden agregar, junto con las interfaces, en
unidades modulares mayores que son los paquetes.
Encapsulacin: Es la capacidad de ocultar los detalles de implementacin. En concreto
los detalles de implementacin del estado de un objeto y los detalles de
implementacin del cuerpo de los mtodos. Esta capacidad se consigue en Java
mediante la separacin entre interfaces y clases. Los clientes (programadores que
usan) de un objeto interactan con l a travs del contrato ofrecido (interfaz). El
cdigo de los mtodos quedan ocultos a los clientes del objeto.

23

24

Introduccin a la Programacin

Reutilizacin: Una vez implementada una clase de objetos, puede ser usada por otros
programadores ignorando detalles de implementacin. Las tcnicas de reutilizacin
pueden ser de distintos tipos. Una de ellas es mediante la herencia de clases como se
ha visto arriba.
Facilidad de Depuracin: Es la facilidad para encontrar los errores en un programa. Un
programa bien estructurado en mdulos, es decir con un buen diseo de clases,
interfaces y paquetes, se dice que es fcilmente depurable y por tanto la correccin de
errores ser ms fcil.
Comprensibilidad: Es la facilidad para entender un programa. La comprensibilidad de
un programa aumenta si est bien estructurado en mdulos y se ha usado la
encapsulacin adecuadamente.

8. Problemas propuestos
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

Cree la interfaz Punto


Cree la interfaz Circulo
Cree el tipo enum Color
Cree la interfaz Pixel teniendo en cuenta que debe heredar de Punto.
Cree la interfaz Vector2DC teniendo en cuenta que en vez de reutilizar Punto por
herencia lo haga por composicin.
Implemente la clase PuntoImpl, con el cdigo visto en el captulo, teniendo en cuenta
que debe implementar el interfaz Punto.
Implemente la clase PixelImpl teniendo en cuenta que debe implementar el interfaz
Pixel y heredar de PuntoImpl.
Implemente la clase Test vista anteriormente.
Implemente la clase TestPuntoPixel que herede de Test y nos sirva para comprobar el
funcionamiento adecuado de las clases Punto y Pixel.
Implementar la clase CirculoImpl teniendo en cuenta que debe implementar la interfaz
Circulo visto en el captulo.
Implemente una clase TestCirculo que herede de la clase Test y nos sirva para
comprobar el funcionamiento de la clase implementada
Implemente la clase Vector2DImpl teniendo que cuenta que debe implementar el
interfaz Vector2D y heredar de la clase PuntoImpl.
Implemente la clase Vector2DCImpl para el tipo Vector2D.
Implemente las clases TestVector2D que herede de la clase Test y nos sirva para
comprobar el adecuado funcionamiento de la clase Vector2DImpl y Vector2DCImpl.
Defina un tipo Recta mediante una interfaz para trabajar con rectas en el plano. Vamos
a suponer que excluimos las rectas paralelas al eje de ordenadas porque tienen
pendiente infinita. Algunas propiedades de una recta son su pendiente y los puntos de
corte con los ejes. Debe proporcionar mtodos que digan si un Punto pertenece a una
Recta, si dos rectas son paralelas, si son perpendiculares, dadas dos rectas hallar el
Punto de corte, hallar la Recta paralela a otra por un Punto, la perpendicular a una
Recta por un Punto, etc.

1. Introduccin a la Programacin Orientada a Objetos

16. Implemente varias clases posibles para el tipo Recta. Puede tomar distintas decisiones
para los atributos: dos puntos, la pendiente y un punto, los valores de A, B y C en la
ecuacin general de una recta, etc.

25

You might also like