Informatica
Enviado por estudi • 4 de Abril de 2012 • 2.872 Palabras (12 Páginas) • 295 Visitas
Relacion De-La-Especie
Considera que has escrito un programa para dibujar. Este programa debería permitir el dibujo de variados objetos tales como puntos, rectángulos, triángulos y muchos más. Por cada objeto, tu provees una definición de clase. Por ejemplo, la clase Point define un punto por sus coordenadas :
class Point {
attributes:
int x, y
methods:
setX(int newX)
getX()
setY(int newY)
getY()
}
Tú continúas definiendo clases de tu programa de dibujo con una clase para describir círculos. Un círculo define un punto central y un radio :
class Circle {
attributes:
int x, y,
radius
methods:
setX(int newX)
getX()
setY(int newY)
getY()
setRadius(newRadius)
getRadius()
}
Comparando ambas definiciones de clase, podemos observar lo siguiente :
• Ambas clases tienen dos elementos de datos x y y. En la clase Point estos elementos describen la posición del punto, en el caso de la clase Circle describen el centro del círculo. Así, x y y tienen el mismo significado en ambas clases: Describen la posición de su objeto asociado por medio de la definición de un punto.
• Ambas clases ofrecen el mismo conjunto de métodos para obtener y definir el valor de los dos elementos de datos x and y.
• La clase Circle "añade'' un nuevo elemento de datos radius y sus correspondientes métodos de acceso.
Conociendo las propiedades de la clase Point podemos describir un círculo como un punto más un radio más métodos para accesarlo. Así, un círculo es "de-la-especie" Point. Sin embargo, un círculo es algo más "especializado". Ilustramos ésto gráficamente en la Figura 5.1.
Figura 5.1: Ilustración de la relación "de-la-especie".
En ésta y en las siguiente figuras, las clases se dibujan usando rectángulos. Su nombre siempre empieza con una letra mayúscula. Las flechas indican la dirección de la relación, de ahí que se deba leer como "Circle es de-la-especie Point".
Relación Es-Un(a)
La relación anterior se usa al nivel de clase para describir las relaciones entre dos clases similares. Si creamos objectos de tales clases, nos referimos a su relación como una relación "es-un(a)".
Desde el momento que la clase Circle es de la especie de la clase Point, una instancia de Circle, digamos acircle, es un point . Consecuentemente, cada círculo se comporta como un punto. Por ejemplo, tú puedes mover puntos en la dirección x al alterar el valor de x. Similarmente, tú mueves círculos en ésta dirección al alterar su valor de x.
La Figura 5.2 ilustra esta relación. En ésta y en las siguientes figuras, los objetos se dibujan usando rectángulos con las esquinas redondeadas. Su nombre consiste solamente de letras minúsculas.
Figura 5.2: Ilustración de la relación "es-un(a)".
Relación Parte-De
Algunas veces necesitas poder construir objetos haciendo una combinación de otros. Tú ya sabes ésto por la programación procedimental, donde tú tienes la estructura o registro para juntar variados tipos de datos.
Regresemos a nuestro programa de dibujo. Tú ya has creado varias clases para las figuras disponibles. Ahora decides que quieres tener una figura especial que representa tu propio logotipo que consite en un círculo y un triángulo. (Asumamos que tú ya tienes definida un clase Triangle.) De este modo, tu logo consiste en dos partes o, el círculo y el triángulo son parte-de tu logotipo:
class Logo {
attributes:
Circle circle
Triangle triangle
methods:
set(Point where)
}
Ilustramos ésto con la Figura 5.3.
Figure 5.3: Ilustración de la relación "parte-de".
Relación Tiene-Un(a)
Esta relación es justamente la inversa de la relación parte-de. Por lo tanto, podemos fácilmente añadir esta relación a la ilustración parte-de añadiendo flechas en la otra dirección (Figura 5.4).
Figura 5.4: Ilustración de la relación "tiene-un(a)".
5.2 Herencia
Con la herencia podemos hacer uso de las relaciones de-la-especie y es-un(a). Como se describió anteriormente, las clases que son de-la-especie de otra clase comparten propiedades de esta última. En nuestro ejemplo con el punto y el círculo, podemos definir un círculo, el cuál hereda de punto:
class Circle inherits from Point {
atrributes:
int radius
methods:
setRadius(int newRadius)
getRadius()
}
La clase Circle hereda todos los elementos de datos y métodos de la clase Point. No hay necesidad de definirlos dos veces : Solamente usamos los ya existentes (y familiares) datos y definiciones de métodos.
Al nivel de objeto ahora podemos usar un círculo justamente como habríamos usado un punto, debido a que un círculo es-un(a) punto. Por ejemplo, podemos definir un objeto círculo y establecer sus coordenadas del punto central :
Circle acircle
acircle.setX(1) /* Heredado de Point */
acircle.setY(2)
acircle.setRadius(3) /* Añadido por Circle */
"Es-un(a)" también implica que podemos usar un círculo en cualquier circunstancia donde se pueda usar un punto. Por ejemplo, se puede escribir una función o un método, digamos move(), el(la) cuál debe mover un punto en la dirección x:
move(Point apoint, int deltax) {
apoint.setX(apoint.getX() + deltax)
}
Debido a que círculo hereda de punto, tu puedes usar esta función con un argumento círculo para mover su punto central y, a partir de ahí, todo el círculo :
Circle acircle
...
move(acircle, 10) /* Mover el círculo al mover */
/* su punto central */
Tratemos de formalizar el término "herencia" :
Definición (Herencia) Herencia es el mecanismo que permite que un clase A herede propiedades de una clase B. Decimos "A hereda de B". Objetos de la clase A tienen así acceso a los atributos y métodos de la clase B sin necesidad de redefinirlos. La siguiente definición describe dos términos con los que podemos hacer referencia a las clases involucradas
...