Sunteți pe pagina 1din 20

TEMA 3.

- CONCEPTOS DE PROGRAMACIN ORIENTADA A OBJETOS

3.1. Introduccin

La programacin estructurada supone la base fundamental de cualquier


programador, esto es debido a que es un paradigma bien conocido, se lleva
trabajando con el desde hace mucho tiempo y por ello se ha convertido en una
metodologa muy madura.

A principios de los aos 70 surgieron nuevos planteamientos a la hora de


programar con lenguajes como Simula67 o Smaltalk precursores de una nueva
forma de hacer las cosas; haba nacido la programacin orientada a objetos.

La aparicin de este nuevo paradigma responde a la necesidad de acercar la


manera de programar a la manera de pensar de las personas en lugar de
acomodar nuestra manera de pensar a la forma de trabajar de un ordenador.

Sin embargo no es hasta la dcada de los 80 con la aparicin del lenguaje C++
cuando el concepto de programacin orientada a objetos empieza a extenderse
llegando a convertirse en una alternativa real a la hora de afrontar un desarrollo
de software

Pero que es exactamente la programacin orientada a objetos (POO)?

La POO no es un lenguaje ni una tecnologa, es una manera de hacer las cosas,


una filosofa de desarrollo, que se basa en unos cuantos conceptos
fundamentales que iras conociendo a lo largo de este tema:

Abstraccin
Encapsulacin
Herencia
Polimorfismo

Programacin .NET I. Conceptos de POO 3.1


3.2. Abstraccin

Tal vez la primera pista de en que consiste la abstraccin la encontramos en el


propio nombre de este paradigma: Orientacin a Objetos. Cuando nosotros
hablamos a menudo empleamos abstracciones aunque no seamos conscientes
de ello, podemos decir cosas como flor,automvil, persona, etc.

En estos casos no estamos hablando ni de una flor ni de un automvil ni de


una persona en concreto, estamos haciendo referencia a una entidad abstracta
con unas caractersticas determinadas que son comunes a todos los sujetos que
se engloban bajo ese trmino.

La idea es traspasar este nivel de abstraccin a tus programas y para ello es


necesario hacer uso de las clases y los objetos.

Clase

Una clase es una definicin de un tipo de dato complejo por parte


del usuario. Lo interesante de la POO es que no solo vas a poder
definir las caractersticas de estos tipos de datos sino que adems
vas a establecer cual ser su comportamiento.

Volvamos al ejemplo del automvil mencionado anteriormente. Si


quisiramos hacer una clase empezaramos abstrayendo sus
caractersticas fundamentales y comunes a cualquier automvil
como por ejemplo el nmero de ruedas, la potencia del motor, el
nmero de puertas, el color, matrcula, marca, modelo, etc.
Cada una de estas caractersticas se denomina atributos o
propiedades.

Por otro lado hemos dicho que hay que definir el comportamiento
de este tipo de datos, para el coche podramos definir acciones tales
como arrancar, acelerar, frenar o parar.

Cada uno de estos comportamientos se denomina mtodos.

3.2 Programacin .NET I. Conceptos de POO


Objeto

Un objeto es una realizacin concreta de un elemento de una clase,


o por decirlo de otra manera es un sujeto de un tipo especfico de
clase.

Seguramente con el ejemplo del automvil te quedar ms claro, si


lo piensas tu coche matrcula XZXAAA-BBB, color rojo, con 3 puertas
y una potencia de motor de 80 c.v. es una especificacin del
concepto abstracto de coche., es decir es un objeto de la clase coche

Y no solo tendr los atributos que hemos definido para la clase coche
sino que adems podrs hacer uso de los mtodos de los que goza
la clase.

La sintaxis a emplear para definir una clase ser la siguiente:

Clase Nombre_clase
Declaracin Propiedades

Declaracin Mtodos
Fin Clase

Crear un objeto de una clase determinada se denomina instanciar y se hace


de manera similar a la que usabas cuando declarabas una variable en
programacin estructurada

Declara Objeto de tipo Clase

Programacin .NET I. Conceptos de POO 3.3


Ejemplo de definicin de una clase y declaracin de un objeto

Clase Automovil
Declara matricula de tipo Cadena
Declara potencia de tipo Entero
Declara color de tipo Cadena
Declara ruedas de tipo Entero
Declara velocidad de tipo Real

Procedimiento Encender ()
Inicio
velocidad = 0
Fin

Procedimiento Acelerar (vel : de tipo Real)


Inicio
velocidad = velocidad + vel
Fin

Procedimiento Frenar (vel : de tipo Real)


Inicio
velocidad = velocidad - vel
Fin
Fin Clase

Declara MiCoche de tipo Automovil

3.4 Programacin .NET I. Conceptos de POO


3.2. Encapsulacin

Otro concepto fundamental del paradigma POO es el de encapsulacin. Con la


programacin estructurada los datos (variables) y la manipulacin de los
mismos (funciones) estaban entremezclados en el cdigo y no exista ningn
control de quin y cmo acceda a estos datos o a estas funciones, desde
cualquier parte del cdigo se poda llamar a cualquier funcin y cualquier
funcin poda manipular cualquier variable que estuviera en su mbito de
resolucin.

Ya hemos visto que gracias al uso de clases encerramos (encapsulamos) los


atributos y los mtodos dentro de la clase, pero adems de ayudarnos a
mantener el orden nos proporciona un mecanismo para definir que nivel de
acceso que tenemos a dichos mtodos y atributos.

Existen tres niveles en la restriccin que podemos hacer de atributos y


mtodos:

Privado
Protegido
Pblico

Privado

Un atributo o un mtodo es privado cuando solamente es accesible desde


dentro de la propia clase.

Si seguimos la filosofa de la POO sera muy recomendable que marcars los


atributos de la clase como privados de esta forma solo podras acceder a ellos
mediante los mtodos de la clase.

La sintaxis seria la siguiente

Clase Nombre_clase
Declaracin Privado Propiedades
. . .
Declaracin Privado Mtodos
Fin Clase

Programacin .NET I. Conceptos de POO 3.5


Ejemplo:

Clase Persona
Declara Privado Nombre de tipo Cadena

Procedimiento Privado Nombrar (nom : de tipo Cadena)


Inicio
Nombre = nom
Fin
Fin Clase

Protegido

Un atributo o un mtodo es protegido cuando solamente es accesible desde


dentro de la propia clase o por clases que heredan de ella.

En el siguiente apartado aprenders lo que significa el concepto de herencia.

La sintaxis seria la siguiente:

Clase Nombre_clase
Declaracin Protegido Propiedades
. . .
Declaracin Protegido Mtodos
Fin Clase

Ejemplo:

Clase Automovil
Declara Protegido velocidad de tipo Real

Procedimiento Protegido Acelerar (vel : de tipo Real)


Inicio
velocidad = velocidad + vel
Fin
Fin Clase

3.6 Programacin .NET I. Conceptos de POO


Pblico

Un atributo o un mtodo es pblico cuando es accesible desde dentro y desde


fuera de la clase.

Si seguimos la filosofa de la POO sera muy recomendable que marcars


algunos mtodos de la clase como pblicos de esta forma tendrs algn
mecanismo para acceder a los atributos que deberan ser privados.

La sintaxis seria la siguiente:

Clase Nombre_clase
Declaracin Pblico Propiedades
. . .
Declaracin Pblico Mtodos
Fin Clase

Ejemplo:

Clase Fruta
Declara Pblico piel de tipo booleno

Procedimiento Pblico mondar ()


Inicio
Piel = Falso
Fin
Fin Clase

Programacin .NET I. Conceptos de POO 3.7


Por definicin los atributos de una clase deben ser privados o protegidos y los
mtodos (no necesariamente todos, pero si al menos los que constituyen la
interfaz de la clase) deben ser pblicos.

Es tu responsabilidad decidir que mtodos y atributos sern accesibles desde


el interior o exterior de la clase, pero debes considerar que si todos son pblicos
no estaras encapsulando correctamente los datos y si todos son privados la
clase sera total mente intil por que no podras hacer nada con ella al no poder
acceder de ninguna manera.

El conjunto de mtodos pblicos que presenta una clase se denomina Interfaz


y es a travs de esta interfaz de la que deberas acceder a los atributos
privados.

El conjunto de mtodos privados (o protegidos) de un clase se denomina


Implementacin y solo son accesibles a travs de otros mtodos que sean
pblicos.

La manera de acceder a la parte publica de una clase (es decir a aquello que
nos permita su interfaz) es mediante lo que se denominan mensajes, que no
es mas que una invocacin a sus mtodos pblicos siguiendo esta sintaxis:

Nombre_objeto.nombre_metodo_publico()

Ejemplo:

Clase Persona
Declara Privado Nombre de tipo Cadena
Declara Publico Edad de tipo Entero

Procedimiento Publico Nombrar (nom : de tipo Cadena)


Inicio
Nombre = nom
Fin
Fin Clase

Declara MiAmigo de tipo Persona

3.8 Programacin .NET I. Conceptos de POO


Ejemplo (continuacin):

Esta sentencia sera incorrecta

MiAmigo.Nombre = Jos

por que Nombre es un atributo privado, lo correcto sera utilizar el


mtodo Nombrar() que es pblico:

MiAmigo.Nombrar(Jos)

Sin embargo si se puede acceder directamente al atributo edad por


ser declarado como pblico.

MiAmigo.Edad = 25

Programacin .NET I. Conceptos de POO 3.9


3.4. Herencia

La herencia es la cualidad mediante la cual podemos crear objetos a partir de


otros ya existentes. Estrictamente sera ms apropiado decir que podemos crear
clases basndonos en otras clases que ya estn definidas en el programa.

Imagina la siguiente situacin: Tienes que desarrollar un programa donde llevar


un registro de actividades comerciales por lo que es necesario mantener los
datos de los clientes y los proveedores. El departamento de contabilidad pide
saber cuanto se adeuda a los proveedores en todo momento, por otro lado el
departamento de marketing solicita saber cuando es el cumpleaos de los
clientes para poder mandarles una felicitacin.

Parece claro que tanto los proveedores como los clientes debern ser
modelados con una clase, sin embargo no tienen ambas clases atributos
comunes como pueden ser el nombre, el NIF, el telfono de contacto, la
direccin, etc.? Podran tener ambas clases mtodos comunes como las altas,
bajas y modificaciones de datos en el sistema?

Parece claro que entre la clase CLIENTE y la clase PROVEEDOR va a existir cierta
relacin, realmente podemos sacar elementos comunes de ambas clases e
incluirlos en una clase superior que podramos llamar USUARIO

3.10 Programacin .NET I. Conceptos de POO


Cuando una clase (clase hija) hereda de otra (clase madre) automticamente
incorpora todos los atributos y mtodos, pero no esto no implica que la clase
derivada (clase hija) no pueda seguir aadiendo sus propios atributos y
mtodos o incluso redefinir alguno de los heredados segn sus necesidades
especficas.

En el ejemplo anterior la clase CLIENTE heredaba de la clase USUARIO todos


sus mtodos y propiedades, pero adems aade un nuevo atributo propio y un
nuevo mtodo.

Por lo tanto puedes instanciar un objeto de la clase CLIENTE ...

Objeto Cliente:

Los atributos Nombre, Apellidos, NIF, Direccion y Telefono as como


los mtodos Alta, Baja, Modificacion y Eliminacion son heredados.
El atributo Cumpleaos y el mtodo Felicitar son nuevos aadidos
por la propia clase.

...y empezar a usar directamente cualquiera de sus mtodos (y atributos)


pblicos ya sean propios o heredados

Declara MiCliente de tipo Cliente

MiCliente.Alta()
Micliente.Felicitar()

Programacin .NET I. Conceptos de POO 3.11


Es muy posible que a lo largo de tu proyecto de programacin disees muchas
clases de las cuales no vas a instanciar ningn objeto y solo sern usadas para
crear otras clases heredadas de esta. Este tipo de clases se denominan clases
abstractas.

Tambin suele ser habitual que en estas clases abstractas los mtodos se
declaren pero la funcionalidad de los mismos no sea implementada dejando
esta tarea para el momento en que se definan las clases heredadas. Esta
redefinicin de los mtodos de una clase forma parte de otra caracterstica de
la POO: el polimorfismo.

3.12 Programacin .NET I. Conceptos de POO


3.5. Polimorfismo y sobrecarga

Posiblemente el concepto de polimorfismo sea uno de los ms difciles de


entender en un primer momento. La palabra polimorfismo proviene del griego
y significa varias formas y eso es precisamente lo que le puede suceder a un
mtodo, o a un operador, que se comporte de formas distintas.

Vamos a aclarar un poco esta cuestin centrndonos principalmente en los


mtodos de una clase. La idea es poder definir un mtodo con un mismo
nombre pero que su comportamiento sea distinto dependiendo de alguna
situacin especifica.

Se puede hablar de:

Polimorfismo por sobrecarga


Polimorfismo paramtrico
Polimorfismo de subtipado

Polimorfismo por sobrecarga

El polimorfismo por sobrecarga se produce cunado dos clases


distintas y no relacionadas mediante herencia llaman a alguno de
sus mtodos con el mismo nombre.

Por ejemplo puedes tener la clase FINANCIERO con un mtodo


llamado Contar() y que sirva para hacer el calculo de un balance
y puedes tener la clase COMERCIAL con otro mtodo tambin
llamado Contar() y que sirva para especificar que puntos se deben
exponer en las reuniones de ventas.

En ambos casos el mtodo se llama igual, pero su funcionalidad es


distinta dependiendo del objeto que haga uso de el, si es un objeto
de tipo Financiero o es un objeto de tipo Comercial. En estos casos
decimos que el mtodo est sobrecargado

Otro forma de hacer sobrecarga puede ser sobre algunos


operadores, por ejemplo el operador + puede servir
indistintamente para sumar dos nmeros enteros o para concatenar
dos cadenas, es decir si el objeto que hace uso del operador es del
tipo Entero se realiza un operacin de suma pero si el objeto es de
tipo Cadena la operacin que se lleva a cabo es la de concatenar.

Programacin .NET I. Conceptos de POO 3.13


Polimorfismo paramtrico

Dentro de una misma clase puedes tener ms de un mtodo con el


mismo nombre pero que difieran entre si en el nmero y/o tipo de
parmetros de entrada / salida, esta situacin es la que se califica
como polimorfismo paramtrico.

Ejemplo:

Clase Figura_Geomtrica
Declara Privado Area de tipo Real

Procedimiento Publico Calcular_area (triang : de tipo


Triangulo)
Inicio
Area = (triang.base * triang.altura)/2
Fin

Procedimiento Publico Calcular_area (cuad : de tipo Cuadrado)


Inicio
Area = (cuad.lado * cuad.lado)
Fin

Fin Clase

3.14 Programacin .NET I. Conceptos de POO


Polimorfismo de subtipado

Ya habas visto en el apartado anterior que gracias a la herencia


algunas clases se utilizan como base para derivar otras ms
especializadas.

Cuando las clases abstractas definen los mtodos se suelen dejar


vacos para implementar la funcionalidad en las clases derivadas
de manera especfica, esto es lo que se conoce como redefinicin
de un mtodo o polimorfismo de subtipado.

Imagina que eres el poseedor de una franquicia de restaurantes


repartidos por todo el pas y una de las instrucciones de
funcionamiento de la franquicia es preparar todos los das el
plato especial sin embargo tu poltica de empresa exige a cada
franquicia preparar el plato especial adaptndolo a los gustos
locales, as que si traspasamos esta situacin a un programa,
una forma de enfocarlo sera que la clase base abstracta
RESTAURANTE contiene el mtodo Preparar_Plato_Especial(), pero
ser cada una de las clases hijas de cada franquicia la que
redefinan el mtodo para adaptarlo a sus propias necesidades
especficas y gustos locales de los clientes.

Programacin .NET I. Conceptos de POO 3.15


A modo de resumen te planteo el siguiente ejemplo: Una empresa de telefona
quiere gestionar sus clientes, teniendo en cuenta que los clientes pueden ser
de contrato o de prepago la forma de facturar ser distinta.

Los datos de cualquier cliente son: Nombre, Apellidos, NIF, nmero de telfono
contratado. Por un lado para los clientes de prepago debemos conocer en todo
momento cual es su saldo disponible actual, mientras que para los de contrato
hay que llevar un control del consumo acumulado para facturrselo a final de
mes a una cuenta de la que debemos conservar el nmero.

Otro requisito es que se tenga en cuenta que las tarifas aplicables no son las
mismas si se llama a un nmero de nuestro mismo operador.

Para empezar la primera clase que parece imprescindible es la clase CLIENTE.


Adems es evidente que se pueden hacer dos clases que hereden de ella, la
clase CLIENTE_PREPAGO y la clase CLIENTE_CONTRATO. Sera interesante
hacer un mtodo de facturacin en la clase abstracta CLIENTE y redefinirlo en
cada una de las clases heredadas.

3.16 Programacin .NET I. Conceptos de POO


Para facilitar un poco ms la labor vamos a crear otra clase denominada TARIFA
que nos ayudar a calcular los importes de las llamadas dependiendo del
numero de destino

La funcin Dar_importe() ser una funcin polimrfica segn los parmetros


de entrada y devolver el importe de una llamada dependiendo el operador de
destino.

Una vez que tengamos el funcionamiento del programa bien definido solo
queda programar la clase TARIFA, la clase CLIENTE, la clase
CLIENTE_CONTRATO y la clase CLIENTE_PREPAGO junto con el programa
principal donde instanciaremos los objetos de dichas clases y los pondremos a
funcionar.

En este ejemplo se han pasado por alto algunas cuestiones, como la forma en
la que se deberan acceder a los datos privados de los clientes (Nombre,
apellidos, etc) por lo tanto te nimo a que completes por tu cuenta este ejemplo
aadiendo los procedimientos y funciones que creas necesarias para cambiar
los datos de los clientes en caso de altas, bajas o modificaciones.

Programacin .NET I. Conceptos de POO 3.17


CLASE TARIFA

Clase Tarifa
Declara Privado Importe_mismo_operador de tipo Real = 0.3
Declara Privado Importe_operador_A de tipo Real = 0.6
Declara Privado Importe_operador_B de tipo Real = 0.5

Funcion Pblica Dar_importe (num_destino : de tipo Cadena) : de tipo


Real
Inicio
Si num_destino = numeros_de_operador_A entonces
Dar_importe = Importe_operador_A
Sino
Dar_importe = Importe_operador_B
Fin Si
Fin

Funcion Publica Dar_importe () : de tipo Real


Inicio
Dar_importe = Importe_mismo_operador
Fin

Fin Clase

3.18 Programacin .NET I. Conceptos de POO


CLASE CLIENTE

Clase Cliente
Declara Privado Nombre de tipo Cadena
Declara Privado Apellidos de tipo Cadena
Declara Privado NIF de tipo Cadena
Declara Privado Telefono de tipo Cadena
Declara Privado Tarifa_aplicable de tipo Tarifa

Funcion Pblica Llamar (num_destino : de tipo Cadena, segundos : de tipo


Entero) : de tipo Real
Inicio
Si num_destino <> numeros_de_la_compaia entonces
Llamar = segundos *
Tarifa_aplicable.Dar_importe(num_destino)
Sino
Llamar = segundos * Tarifa_aplicable.Dar_importe()
Fin Si
Fin

Procedimiento Pblico Facturar (num_destino : de tipo Cadena)


Inicio
. . .
Fin

Fin Clase

Programacin .NET I. Conceptos de POO 3.19


CLASE CLIENTE_CONTRATO

Clase Cliente_Contrato
Declara Privado Consumo_actual de tipo Real
Declara Privado Numero_cuenta de tipo Cadena

Procedimiento Pblico Facturar (num_destino : de tipo Cadena)


Inicio
Consumo_actual = Consumo_actual + Llamar(num_destino)
Fin

Fin Clase

CLASE CLIENTE_PREPAGO

Clase Cliente_Prepago
Declara Privado Credito de tipo Real

Procedimiento Pblico Facturar (num_destino : de tipo Cadena)


Inicio
Credito = Credito - Llamar(num_destino)
Fin

Fin Clase

PROGRAMA PRINCIPAL

Inicio Programa

Declara MiClienteContrato de tipo Cliente_Contrato


Declara MiClientePrepago de tipo Cliente_Prepago

Funcin Principal()
Inicio
MiClienteContrato.Facturar(69845112)
MiClientePrepago.Facturar(67705110)
Fin

Fin Programa

3.20 Programacin .NET I. Conceptos de POO

S-ar putea să vă placă și