Está en la página 1de 23

Ejemplo Empresa

Se desea modelar lo siguiente: una Empresa que se dedica a la venta de


electrodomésticos tiene empleados de los cuales mantiene los datos
personales (nombre y apellido, dni, cantidadHijosMenores, …), legajo,
fecha de ingreso a la empresa y sueldo básico, horarioTrabajo
En la empresa trabajan distintos tipos de empleados: los vendedores, los
administrativos, los directivos, los de maestranza, ...
Al momento de calcular el sueldo correspondiente a un empleado se debe
considerar lo siguiente:
- un empleado directivo cobra un plus por su cargo.
- un empleado administrativo cobra un adicional si tiene título
universitario, y puede cobrar horas extra
- un empleado vendedor cobra una comisión de xx% sobre las ventas
realizadas
...
Programación Orientada a Objetos 2020

En este enunciado interviene una empresa, pero vamos a centrarnos en


las características de los empleados para trabajar con herencia

Segun lo indicado de todos los empleados se tiene información personal,


legajo, fecha de ingreso, sueldo básico y horario de trabajo.

Por otra parte hay algunos tipos de empleados de los que se requiere
mantener información especial, que seguramente afectará al cálculo
de su sueldo.

1
Ejemplo Empresa
Clase Empleado
datosPersonales (rel)
legajo
fechaIngreso
sueldoBasico
horarioTrabajo
tipoEmpleado
horasExtra
tituloUniversitario
cargo
montoVentasMes
...

Programación Orientada a Objetos 2020

Para resolver la situación planteada, centrándonos en la información de los empleados y


abstrayendo las restantes características de la Empresa, se nos ocurre tener una clase
Empleado que considera variables para mantener TODA la información que se necesita
para contemplar los distintos tipos de empleados.
Entonces:
- se tiene la información general de todos los empleados: datosPersonales, legajo,
fechaIngreso, sueldoBasico y horarioTrabajo.
- y además se tiene la información particular de los distintos casos:
- para el caso de los empleados directivos se necesita mantener el cargo
- para el caso de los empleados vendedores se necesita mantener el monto de las
ventas por mes
- para el caso de los empleados administrativos se necesita saber si tienen título
universitario y la cantidad de horas extra

El problema es que además es necesario tener una indicación de que tipo de empleado se
trata para poder decidir en cada momento que variables debo utilizar, y ademas las
variables restantes correspondientes a los otros tipos serán desaprovechadas.

Por ejemplo en el caso de un empleado administrativo tendrá en uso:


datosPersonales, legajo, fechaIngreso, sueldoBasico, horarioTrabajo, tipoEmpleado,
tituloUniversitario y horasExtra. Mientras que a montoVentasMes y cargo también las tendrá
pero inutilizadas.
Y esto va a suceder con todas las instancias de empleado de los distintos tipos.
Ademas en el caso de los empleados que no tienen las características de ninguno de los tipos
indicados tendrán inutilizadas TODAS las variables a partir de tipoEmpleado inclusive.
2
Ejemplo Empresa
Clase Empleado
datosPersonales (rel)
legajo
fechaIngreso
sueldoBasico
horarioTrabajo
tipoEmpleado
horasExtra Administrativo
tituloUniversitario
cargo Directivo
montoVentasMes Vendedor

Programación Orientada a Objetos 2020

… Entonces, hay que buscar una SOLUCION para superar el problema.


Además del mal aprovechamiento de lo estructura interna de los objetos que están
utilizando mal la memoría, también se complejiza el trabajo. - cuando se requiera escalar
el sistema, agregando mas tipos de empleados, por ejemplo, será necesario agregar
nuevas variables que afectarán a todos los demás tipos de empleados
- habrá que modificar TODOS los métodos que dependan de los distintos tipos de
empleados para sus cálculos o acciones
- será muy complicado el mantenimiento

… Entonces … podríamos plantear el uso de clases especiales para cada tipo de


empleado, que tengan sólo las variables y el comportamiento que les corresponda. Así si
debemos contemplar nuevos tipos de empleados, solo habrá que agregar mas clases
con sus características específicas, y no será necesario modificar lo que ya está definido
para los demás tipos.

… En este caso serán 3 clases:


- para representar a un empleado administrativo
- para representar a un empleado vendedor
- para representar a un empleado directivo
Siempre manteniendo la clase original Empleado

3
Ejemplo Empresa
Empleado
EmpleadoDirectivo
Empresa EmpleadoVendedor
EmpleadoAdministrativo

...
1..*
Empleado

EmpleadoDirectivo EmpleadoVendedor

EmpleadoAdministrativo

ColEmpleados (adm1, vend1, vend2, emp1, adm2, vend3, emp2, emp3, dir1, ...)

Programación Orientada a Objetos 2020

Definimos una jeraquía de clases, con una clase raiz o clase padre que es la clase
Empleado y clases hijas que son EmpleadoDirectivo, EmpleadoAdministrativo y
EmpleadoVendedor.

La clase Empleado, es la superclase y es la que tiene las características generales de


TODOS los empleados, sean del tipo que sean. Entonces en la clase Empleado están
las variables:
datosPersonales, legajo, fechaIngreso, sueldoBasico y horarioTrabajo.

Todo empleado que no sea vendedor, administrativo ni directivo será instancia de la clase
Empleado.
Todo empleado administrativo será instancia de la clase EmpleadoAdministrativo, y tendrá
sus propias características, es decir tendrá lo que tienen TODOS los empleados y la
información propia y el comportamiento propio de los administrativos. Entonces cada
instancia de EmpleadoAdminsitrativo tiene datosPersonales, legajo, fechaIngreso,
sueldoBasico, horarioTrabajo y … tituloUniversitario y horasExtra, que son propias de los
administrativos.

De igual manera se consideran las otras clases

4
Ejemplo Empresa
Clase Empleado
datosPersonales (rel) , legajo, fechaIngreso,
sueldoBasico, horarioTrabajo

Clase EmpleadoAdministrativo
horasExtra, tituloUniversitario, ...

Clase EmpleadoVendedor
montoVentasMes, …

Clase EmpleadoDirectivo
cargo, ...

Programación Orientada a Objetos 2020

Entonces lo que definimos es una RELACION DE HERENCIA entre la clase EMPLEADO


(superclase, o clase padre) y las clases EMPLEADODIRECTIVO,
EMPLEADOVENDEDOR Y EMPLEADOADMINISTRATIVO, que son las subclases.

En la superclase Empleado, se define


- la estructura común de TODOS los empleados: datosPersonales, legajo,
fechaIngreso, sueldoBasico y horarioTrabajo
La subclase EmpleadoVendedor HEREDA esa estructura y agrega sus propias variables:
montoVentasMes (y posiblemente otras necesarias)
La subclase EmpleadoAdministrativo HEREDA esa estructura y agrega sus propias
variables: tituloUniversitario y horasExtra (y posiblemente otras necesarias)
La subclase EmpleadoDirectivo HEREDA esa estructura y agrega sus propias variables:
cargo (y posiblemente otras necesarias)

5
Ejemplo Empresa
Empresa

...
1..*
Empleado DatosPersona

EmpleadoDirectivo EmpleadoVendedor

EmpleadoAdministrativo

ColEmpleados (adm1, vend1, vend2, emp1, adm2, vend3, emp2, emp3, dir1, ...)

Programación Orientada a Objetos 2020

En particular “datosPersonales” podría ser una referencia a una instancia de una clase
DatosPersona, por lo que sería la implementación de una “asociación” o “agregación”, lo
que significa que las relaciones entre clases (asociación, agregación, composición)
también se heredan.
Todas las subclases de Empleado HEREDAN la relación que tiene Empleado con
DatosPersona

¿Podría Empleado ser una subclase de Persona, es decir sería correcto plantear una
relación de herencia entre la clase Persona y la clase Empleado?. Todo depende del
contexto en que se presente el problema, de la información que se tenga y de lo que se
requiera. Si bien un Empleado es una persona, puede haber parte del comportamiento
de una persona que no sea útil para un empleado. En el enunciado dado hay muy poca
información al respecto por lo que decidimos no considerar esa relación de herencia.
_________________________________________________________________________

La asociación entre Empresa y Empleado, ¿quién debe implementarla?


Considerando la navegabilidad indicada, la empresa es la responsable de implementar la
relación, y debe hacerlo con una colección, por la multiplicidad 1..*. Quiere decir que la
instancia de Empresa tiene una variable instancia que es una colección (de algún tipo).
Y ...¿qué hay en esa colección? ¿Es solo 1 colección, o son 4, una para cada tipo de
empleado?

La idea es mantener a TODOS los empleados en una misma colección, de manera que
para accionar sobre los empleados se trabaje sobre esa única colección. Entonces la
colección tendrá referencias a instancias: de Empleado, de EmpleadoAdministrativo, de
EmpleadoVendedor y de EmpleadoDirectivo 6
Ejemplo Empresa
Empresa

...
1..*
Empleado DatosPersona
calcularSueldo()

EmpleadoDirectivo EmpleadoVendedor
calcularSueldoDirectivo() calcularSueldoVendedor()
EmpleadoAdministrativo

calcularSueldoAdministrativo()

ColEmpleados (adm1, vend1, vend2, emp1, adm2, vend3, emp2, emp3, dir1, ...)

Programación Orientada a Objetos 2020

… y ¿qué sucede con el comportamiento? ¿el comportamiento también se hereda?

El comportamiento también se hereda.


En la superclase Empleado se considera el comportamiento común a TODOS los
empleados, y las subclases heredan ese comportamiento
En el protocolo de mensajes de la clase Empleado están los métodos de acceso a las
variables (obtenerFechaIngreso, setearFechaIngreso, obtenerLegajo, setearLegajo, …)
y los mensajes de acción como calcularSueldo.

La clase EmpleadoVendedor hereda el comportamiento de su superclase Empleado, por lo


que una instancia de EmpleadoVendedor puede responder al mensaje
obtenerFechaIngreso utilizando el método que esta implementado en la clase Empleado.

El punto importante es el mensaje calcularSueldo, dado que el cálculo del sueldo es


justamente donde intervienen las características específicas de cada tipo de empleado.
Entonces … ¿heredarlo no sirve?
Supongamos que decidimos tener un método específico para calcular el sueldo, en cada
subclase, sería:
- calcularSueldoVendedor
- calcularSueldoAdministrativo
- calcularSueldoDirectivo

7
Ejemplo Empresa
Empresa

...
1..*
calcularSueldo() Empleado DatosPersona

EmpleadoDirectivo EmpleadoVendedor
calcularSueldoDirectivo() calcularSueldoVendedor()
calcularSueldo() EmpleadoAdministrativo calcularSueldo()

calcularSueldoAdministrativo()
calcularSueldo()
ColEmpleados (adm1, vend1, vend2, emp1, adm2, vend3, emp2, emp3, dir1, ...)

Programación Orientada a Objetos 2020

Entonces cuando en la empresa se requiera calcular el sueldo para todos los empleados,
se tendrá que preguntar de que tipo de empleado se trata para saber cuál es el mensaje
que se debe enviar. Si es una instancia de EmpleadoVendedor le envío
calcularSueldoVendedor, si es una instancia de EmpleadoAdministrativo le envío el
mensaje calcularSueldoAdministrativo, y …
No parece una buena decisión trabajar de esa forma …
Hay que utilizar mensajes polimórficos y redefinición de métodos

En la superclase Empleado se considera el comportamiento común a TODOS los


empleados, respecto al cálculo del sueldo, utilizando la variable sueldoBásico y las
subclases heredan ese comportamiento y lo extienden agregando el comportamiento
específico.

Entonces el mensaje calcularSueldo, DEBE ser un mensaje polimórfico, que está


implementado en la superclase Empleado, y es REDEFINIDO en las subclases que
necesiten redefinirlo.

8
Herencia
permite que una clase sea definida del tipo de la otra
EmpleadoVendedor
Empleado

La clase EmpleadoVendedor toma el comportamiento y


la estructura interna de la clase Empleado, y agrega su
propia conducta (extiende/especializa)
Programación Orientada a Objetos 2020
9

Esto significa que en la clase EmpleadoVendedor tendré que definir


las variables necesarias para los atributos que son propios de un
vendedor y tendré que implementar los métodos asociados a
mensajes que son propios del comportamiento de un vendedor.

Además tendré que agregar variables para las relaciones que tenga la
clase vendedor con otras clases (si existen y no son heredadas) y
redefinir los métodos que sea necesario para especializar el
comportamiento

9
Herencia
El comportamiento y datos asociados con las clases hijo (subclase)
son siempre una extensión de las propiedades asociadas con la clase
padre (superclase), es decir un conjunto mayor que lo incluye

EmpleadoVendedor
El conjunto de propiedades
Empleado de la clase
EmpleadoVendedor
incluye al conjunto de
propiedades de la clase
Empleado

Programación Orientada a Objetos 2020


10

¿siempre?
Esa es el objetivo al trabajar con herencia y polimorfismo: que la
subclase extienda a la superclase.

Esto no siempre se logra. En ocasiones puede ocurrir que parte del


comportamiento heredado de una superclase no sea correcto en la
subclase, y sea necesario bloquearlo (volveremos a hablar de esto
mas adelante)

10
Gráficamente la Herencia
La clase EmpleadoVendedor define sólo sus
propias operaciones y estructura interna y hereda
las operaciones y estructura definidas en la clase
Empleado
Diagrama de clases ●
un EmpleadoVendedor es
Empleado un Empleado

un EmpleadoAdministrativo
es un Empleado

EmpleadoAdministrativo ... EmpleadoVendedor

Programación Orientada a Objetos 2020


11

Si la relación entre las clases responde a “es un”, entonces la herencia


es correcta.

Por cuestiones de espacio no aparece la clase EmpleadoDirectivo,


corresponde a “...”

11
Relación de herencia entre las clases A y B
A es superclase de B
B es subclase de A
Empleado es superclase de EmpleadoVendedor y
EmpleadoAdministrativo
EmpleadoVendedor es subclase de Empleado
EmpleadoAdministrativo es subclase de Empleado.

La subclase B de A tiene definido un método M1


La clase A también tiene definido el método M1

La subclase B redefine el método M1 de la superclase A

Programación Orientada a Objetos 2020


12

La redefinición de métodos esta relacionada al polimorfismo. El


polimorfismo puede darse de varias formas, una de esas formas es
la redefinición.

En el ejemplo lo aplicaremos sobre el mensaje “calcularSueldo()”

En la clase Empleado estará implementado el método calcularSueldo, y


en la subclase EmpleadoVendedor estará redefinido el método
calcularSueldo.

12
Mecanismo de búsqueda de mensajes
el objeto O recibe un mensaje
se busca el mensaje en la clase CO del objeto O
si el mensaje está definido en la clase CO, se ejecuta
si no se encuentra el mensaje se busca en la superclase
de
CO
si no se encuentra, sigue la búsqueda hacia arriba en la
jerarquía, recorriendo la cadena de superclases
si al llegar a la clase raíz no se encontró ERROR

Programación Orientada a Objetos 2020


13

Cuando un objeto recibe un mensaje, la búsqueda del método


correspondiente comienza en la clase del objeto receptor del
mismo. Si el método no se encuentra en la clase, se busca en la
superclase, y la búsqueda, de ser necesario, continua por la cadena
de superclases hasta encontrarlo o hasta la clase base de la
jerarquía.

Si se envía el mensaje obtenerFechaIngreso a un objeto


EmpleadoAdministrativo, la búsqueda comienza en la clase
EmpleadoAdministrativo, y continua por la clase Empleado.

Si se envía el mensaje calcularSueldo a un objeto


EmpleadoAdministrativo, la búsqueda comienza en la clase
EmpleadoAdministrativo, y alli termina ya que ahi está el método
indicado.

13
Características:
Las clases están organizadas en una única jerarquía de
herencia
La clase más general, raíz del árbol es Object ó …
Una clase puede tener varias subclases
Una clase puede tener sólo una superclase directamente
superior en la jerarquía
Este tipo de herencia se denomina Herencia Simple
Cualquier clase que se agregue a la jerarquía debe ser
subclase (directa o indirectamente) de la clase raíz (Object)

Nota: algunos lenguajes permiten jerarquías de clases


independientes (C++, otros)
Programación Orientada a Objetos 2020
14

14
las subclases pueden . . .
redefinir métodos agregar métodos
¿redefinir atributos? agregar atributos
pueden agregarse asociaciones/agregaciones a las
subclases

Un objeto de una subclase puede ser usado en cualquier


situación donde es posible usar un objeto de la superclase, sin
efecto observable

Principio de sustitutabilidad

Esto indica que la herencia se esta aplicando de forma apropiada

Programación Orientada a Objetos 2020


15

Las subclases pueden agregar variables (para considerar los atributos específicos y las
relaciones específicas) y pueden agregar métodos correspondientes a los mensajes
propios que las instancias de la subclase pueden responder.

Las subclases pueden además redefinir algunos de los métodos heredados.


La redefinición de atributos depende del lenguaje. Sería como pensar que un atributo
heredado de la superclase, en la subclase es de otro tipo.
Algunos lenguajes lo permiten, siempre que se de una relación de herencia entre las
clases de los atributos. Por ejemplo en la clase Empleado la fechaIngreso referencia
una instancia de la clase Fecha, y en EmpleadoVendedor referencia una instancia de
la clase FechaExtendida, y FechaExtendida es subclase de Fecha.
Algunos lenguajes no lo permiten. Otros que son dinámicos, como Smalltalk no tienen
restricciones, en cuanto es posible que una variable cambie el tipo de objeto al que
referencia dinámicamente. Sin embargo no es recomendable, dado que podría
cambiar completamente el sentido de lo que estamos heredando, y muy posiblemente
no se respetaría el principio de sustitutabilidad.

Sustitutabilidad: se refiere a que, si en el código indicado se cambia la instancia de


Empleado por una instancia de

15
sustitutabilidad . . .
emp1 (Empleado) emp1 (EmpleadoVendedor)

… …
valor := emp1 calcularSueldo. valor := emp1 calcularSueldo.
laEmpresa calcularTotal: valor. laEmpresa calcularTotal: valor.

… (valor es numerico) … (valor es numerico??)

Programación Orientada a Objetos 2020


16

Sustitutabilidad: consideremos el código de la izquierda, en dónde se crea una instancia


de Empleado y se trabaja con ella. Se obtiene un valor, que se espera sea numérico y
se utiliza como argumento para otro mensaje. No se produce ningún error.

Ahora consideremos el código de la derecha, que es el mismo código pero ahora


considerando una instancia de EmpleadoVendedor.

El principio de sustitutabilidad se refiere a que al reemplazar una instancia de Empleado


por una instancia de Vendedor el código debe seguir ejecutándose sin efectos
aparentes, es decir sin dar error no tener que hacer consideraciones.
Si por ejemplo el calcularSueldo enviado al vendedor devuelve una cadena, van a surgir
problemas en lo que continúa. En este caso no se cumpliría el principio.

16
Herencia
la clase de un objeto describe su estructura
especificando las variables instancia de los objetos
cada subclase puede declarar variables instancia
adicionales
la herencia es siempre transitiva, una clase puede
heredar características de varios niveles de
superclases
variables instancia de la clase: UNION de las
variables instancia de todas sus superclases y las
propias
Programación Orientada a Objetos 2020
17

La clase EmpleadoVendedor es subclase de Empleado y Empleado es


subclase de Object, entonces EmpleadoVendedor hereda lo de
Empleado y lo de Object.

17
Herencia
Clase C1 Clase C2 subclase de C1
Var. Instancia: Var. Instancia:
x1, x4,
x2, x5,
x3 x6

el estado de cada instancia de C1:


x1 x2 x3
el estado de cada instancia de C2:
x1 x2 x3 x4 x5 x6
Programación Orientada a Objetos 2020
18

18
¿Clase abstracta ó concreta?
no puede tener
instancias
describe atributos y
comportamiento común tiene instancias
a sus subclases todos los métodos están
tiene operaciones implementados
abstractas puede haber
implementaciones
diferentes en subclases
sin implementación
solo signatura
Programación Orientada a Objetos 2020
19

Hay situaciones en las que es necesario tener una superclase de la


que no se puedan crear instancias pero que utilizan para factorizar
una estructura común a las subclases y/o un comportamiento
común a su subclases.
Una clase con esas características se denomina “clase abstracta”.
Una clase Abstracta puede tener algunos o todos sus métodos
abstractos, es decir sin implementar. Esos métodos deben ser
implementados en las subclases.

Las clases de los niveles intermedios de la jerarquía de clases, desde


la clase raíz, pueden ser abstractas. Una clase que sea terminal, es
decir una hoja en el árbol que representa la jerarquía (una clase
que no tiene subclases), si bien puede ser abstracta, NO tiene
sentido que lo sea.
Una clase abstracta tiene sentido cuando hay subclases CONCRETAS
que heredan e implementan todos sus métodos.

19
¿clase abstracta?

clase A

¿clase abstracta
ó concreta?
clase B clase C

clase E clase F clase D

NO
¿clase abstracta? clase
CONCRETA
Programación Orientada a Objetos 2020
20

En esta jerarquía clase A, clase B y clase C pueden ser abstractas,


mientras que clase E, clase F y clase D deben ser concretas.

20
Ejemplo de jerarquía de clases en Smalltalk
Object
–Magnitude
•Character
•Number
». . .
»Fraction
»Integer
» SmallInteger
»…
». . .
•TimeSpan
». . .Date

Programación Orientada a Objetos 2020


21

21
Ejemplo de jerarquía de clases en Smalltalk

•Number es una generalización de Fraction,


Integer, … (superclase)
•Fraction e Integer son especializaciones de
Number (subclases)
•Magnitude es superclase de Character, Date,
Number, Integer, Fraction, …
•Fraction e Integer siguen el protocolo de Number
y agregan, cada una de ellas su protocolo especial

Programación Orientada a Objetos 2020


22

22
Ejemplo de jerarquía de clases en Smalltalk
•Number define el método unario negated

•Integer responde al mensaje factorial,


factorial las demás no, es
propio de la clase Integer

•Fraction redefine el método negated

•SmallInteger
– hereda el método negated
– no lo redefine
–utiliza el código implementado en Number

Programación Orientada a Objetos 2020


23

23

También podría gustarte