Herencia en POO

Page 1

HERENCIA: MODELADO Y PROGRAMACIÓN Por JORGE HERRERA CASTILLO

INTRODUCCIÓN La herencia es una de las propiedades de la POO que aplica los principios de la generalización y la especialización para la reutilización de software. La herencia es una relación de afinidad entre una clase madre (clase base) y una o varias clases hijas (clases derivadas). La clase madre permite que los objetos de las clases hijas hereden las propiedades definidas para los objetos de la clase madre. Una clase madre puede tener varias clases hijas, sin embargo para algunos lenguajes de programación orientado a objetos está restringido para que una clase hija pueda tener varias clases madres. Este mecanismo que permite que una clase hija pueda tener varias clases madres se denomina herencia múltiple. En la actualidad los lenguajes como el C# y el Java no permiten la herencia múltiple, lenguajes como el C++ permiten la herencia múltiple. Representación gráfica del significado de la herencia simple y la herencia múltiple Personas clase madre Hereda de Profesores clase hija

Mamiferos Hereda de

Hereda de

Estudiantes clase hija

Hereda de Ornitorrincos

Herencia simple Un profesor es una persona Un estudiante es una persona

Oviparos

Herencia múltiple Un ornitorrinco es un mamífero y también es un ovíparo

La figura anterior muestra como en la herencia simple un objeto que pertenezca a una clase hija puede heredar las propiedades (atributos y métodos) de una clase madre, y en una herencia múltiple un objeto de una clase hija puede heredar las propiedades definidas en varias clases madres.

EL PRINCIPIO DE LA GENERALIZACIÓN La generalización se utiliza para encontrar las propiedades comunes a un conjunto de objetos y el cual define la clase base para otras clases que heredan de esta clase base. Las propiedades de la clase base es igual a la intersección de las propiedades de todos los objetos de las clases que conforman el sistema que se modela.


Apuntes del profesor: Curso Programación Orientada a Objetos Profesor: JORGE HERRERA CASTILLO

Principio de la generalización

G

A=

Clase base

B’

A’

G

A’

B=

B’ Clase derivada

Clase derivada

Generalización

Herencia

Como se puede observar en la figura anterior, el principio de la generalización se utiliza para encontrar las propiedades de la clase base a la cual se le derivan una serie de clases.

G= A

B

La generalización es la intersección de las propiedades de un conjunto de clases que tienen propiedades comunes.

EL PRINCIPIO DE LA ESPECIALIZACIÓN La especialización se utiliza para encontrar las propiedades especificas a un determinado conjunto de clases que tienen propiedades comunes. Especialización = Propiedades de una clase – Generalización. Principio de la especialización

G

A’ = A - A

B

B’ = B - A

B

Clase base

A’ Clase derivada

Especialización

B’ Clase derivada

Herencia

Por J. Herrera C

Conclusiones: 1. 2.

El principio de la especialización se utiliza para encontrar las propiedades de las clases hijas, derivada o llamadas también subclases. El principio de la generalización se utiliza para encontrar las propiedades de la clase madre , base o llamada también superclase.

40


Apuntes del profesor: Curso Programación Orientada a Objetos Profesor: JORGE HERRERA CASTILLO

MODELADO DE LA HERENCIA Para modelar la herencia con UML simplemente se enlazan con flechas dirigidas de los clasificadores de las clases derivadas a la clase base. A continuación se presenta un diagrama de clases en notación resumida que modela la herencia simple entre tres clases derivadas y una clase base. Ejemplo de un diagrama de clases de herencia simple en UML notación resumida

Animales

Aves

Mamíferos

Peces Por J. Herrera

En el diagrama de clases de la figura anterior se identifican las clases así: Clase base: Animales Clases derivadas: Aves, Mamíferos y Peces A continuación se presenta un diagrama de clases que modela una estructura de herencia simple, especificando en cada clasificador la visibilidad de los atributo y de los métodos y el tipo de datos de los atributos y el de los resultados devueltos por los métodos. Diagrama de clases para un ejemplo de herencia.

Vehículos - placa: string - motor: string + Vehículos() + asignarPlaca(string):void + asignarMotor(string): void + obtenerPlaca():string + obtenerMotor():string Por Jorge Herrera Castillo

Automóviles

Camiones

- puertas:int=4 - pasajeros:int=5

- ejes:int=2 - toneladas:int=1

+ Automovíles() + asignarAtributos(int,int):bool + obtenerAtributos(int,int):void

+ Camines() + asignarAtributos(int,int):bool + obtenerAtributos(int,int):void

41


Apuntes del profesor: Curso Programación Orientada a Objetos Profesor: JORGE HERRERA CASTILLO

PROGRAMACIÓN DE LA HERENCIA La implementación de la herencia es muy sencilla, simplemente a la signatura de la clase derivada se agrega dos puntos (:) y el nombre de la clase base. El formato para la definición de una clase derivada es como sigue: class nombre_clase_derivada : nombre_clase_base { // Atributos y métodos de la clase derivada } Ejemplo. A continuación se presenta el código fuente en C# que implementa el diagrama de clases de la figura anterior.

La clase base: Vehículos class Vehiculos { private string placa; private string motor; public void asignarPlaca(string placa) { this.placa = placa; } public void asignarMotor(string motor) { this.motor = motor; } public string obtenerPlaca() { return this.placa; } public string obtenerMotor() { return motor; } }

La clase derivada: Automóviles class Automoviles:Vehiculos { private int puertas; private int pasajeros; public Automoviles() { this.puertas = 4; this.pasajeros = 5; } public bool asignarAtributos(int puertas, int pasajeros) { if (puertas <= 0 || pasajeros <= 0) return false;

42


Apuntes del profesor: Curso Programación Orientada a Objetos Profesor: JORGE HERRERA CASTILLO

this.puertas = puertas; this.pasajeros = pasajeros; return true; } public void obtenerAtributos(ref int puertas, ref int pasajeros) { puertas = this.puertas; pasajeros = this.pasajeros; } }

La clase derivada: Camiones class Camiones:Vehiculos { private int ejes; private int toneladas; public Camiones() { this.ejes = 2; this.toneladas = 1; } public bool asignarAtributos(int ejes, int toneladas) { if (ejes <= 1 || toneladas <= 0) return false; this.ejes = ejes; this.toneladas = toneladas; return true; } public void obtenerAtributos(ref int ejes, ref int toneladas) { ejes = this.ejes; toneladas = this.toneladas; } }

LA HERENCIA Y LOS DERECHOS DE ACCESO El hecho de que una clase derivada herede los miembros de una clase base quiera decir que puede acceder a todos los miembros de la clase base. La herencia no anula la restricción de acceso privado. Por lo tanto, aunque una clase derivada incluye todos los miembros de la clase base, no puede tener acceso en forma directa a los miembros privados de la clase base. Para que un miembro de la clase derivada pueda acceder a los miembros privados de la clase base este debe hacerlo a través de los métodos públicos definidos en la clase base. A continuación se muestra un ejemplo que ilustra esta situación del acceso de los miembros privados de una clase base por los de las clases derivadas.

43


Apuntes del profesor: Curso Programaci贸n Orientada a Objetos Profesor: JORGE HERRERA CASTILLO

Diagrama de clases notaci贸n UML Figuras - largo: float=0.0 - ancho: float=0.0 + Figuras() + Set(float, float): bool + Get(float, float): void

Rectangulo

+ Area():float

Triangulo

+ Area():float Por Jorge Herrera Castillo

C贸digo fuente en C# que implementa el diagrama de clases anterior.

Clase Base class Figuras { private float largo, ancho; public Figuras() { largo = ancho = 0.0F; } public bool Set(float largo, float ancho) { if (largo <= 0 || ancho <= 0) return false; this.ancho = ancho; this.largo = largo; return true; } public void Get(ref float largo, ref float ancho) { largo = this.largo; ancho = this.ancho; } }

Clase derivada

class Rectangulo:Figuras {

44


Apuntes del profesor: Curso Programación Orientada a Objetos Profesor: JORGE HERRERA CASTILLO

public float Area() { float l = new float(); float a = new float(); Get(ref l, ref a); return l * a; } }

Clase derivada

class Triangulo:Figuras { public float Area() { float l = new float(); float a = new float(); Get(ref l, ref a); return l * a/2; } }

EL ACCESO A MIEMBROS PROTEGIDOS Cuando en una clase se declara un miembro protegido (protected) este miembro es privado para otros programas pero podrá ser accedido por miembros de las clases derivadas. A continuación se presenta el anterior ejemplo declarando protegidos a los atributos largo y ancho de la clase Figuras. Observe que ahora el método Area() de las clases derivadas Rectángulo y Triangulo puede acceder en forma directa los atributos largo y ancho.

Diagrama de clases notación UML Figuras # largo: float=0.0 # ancho: float=0.0 + Figuras() + Set(float, float): bool + Get(float, float): void

Rectangulo

+ Area():float

Triangulo

+ Area():float Por Jorge Herrera Castillo

45


Apuntes del profesor: Curso Programación Orientada a Objetos Profesor: JORGE HERRERA CASTILLO

Código fuente C# de la implementación del anterior diagrama de clases Clase base class Figuras { protected float largo, ancho; public Figuras() { largo = ancho = 0.0F; } public bool Set(float largo, float ancho) { if (largo <= 0 || ancho <= 0) return false; this.ancho = ancho; this.largo = largo; return true; } public void Get(ref float largo, ref float ancho) { largo = this.largo; ancho = this.ancho; } } Clases derivadas class Rectangulo:Figuras { public float Area() { return largo * ancho; } } class Triangulo:Figuras { public float Area() { return largo * ancho/2; } }

CLASES ABSTRACTAS Y MÉTODOS ABSTRACTOS Un método es abstracto cuando dentro de una clase sólo está definida su signatura (firma), es decir, no tiene cuerpo. El formato para definir un método abstracto en C# es como sigue.

Visibilidad abstract tipo nombre_metodo ( lista parámetros); Una clase que tenga al menos un método abstracto se dice que es una clase abstracta. En C# para indicar que una clase es abstracta a la signatura de la clase se le antepone el modificador abstract, A continuación se muestra un formato general.

46


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.