Sie sind auf Seite 1von 14

Manual corto y basico de Programacion

Orientada a Objetos (hecho por mi)





Programacion Orientada a objetos: El termino "programacion orientada a objetos"
surge del hecho de realizar aplicaciones apoyandose en el paradigma de objetos. Antes que
nada... que es un paradigma?

Paradigma: "Paradigma es un modelo o patrn en cualquier disciplina cientfica u otro
contexto epistemolgico." (Wikipedia). Hablando mal y pronto, paradigma es una manera de
pensar el problema, y en funcion de ello, buscar una solucion. Por ejemplo, si pienso en una
factura (de esas que te dan cuando compras algo), e intento representarla basandome en el
paradigma de objetos, deberia pensarla como: un "objeto factura"... ese objeto tiene ciertas
caracteristicas (una fecha, un cliente, un numero de factura, una cantidad determinada de
productos, etc). Es decir, deberia pensar en la factura como un objeto compuesto por ciertas
caracteristicas. Ahora, dijimos que la factura tenia una determinada cantidad de productos,
entonces podriamos pensar a cada producto tambien como un objeto. El "objeto Producto"
tiene caracteristicas como: precio de costo, descripcion, proveedor, precio de venta, etc,
etc.Redondeando la idea, podemos ver que cada elemento de la realidad que nos rodea,
puede ser pensado como objetos (una persona: con caracteristicas como edad, nombre,
direccion, estado civil --- Un medio de transporte: con caracteristicas como: velocidad maxima,
capacidad maxima de pasajeros, costo, etc). El paradigma de objetos es la forma de pensar a
cada elemento del problema que tenemos que resolver, como si fuera un objeto. Existen otros
paradigmas, como el paradigma procedural (u orientado a los procedimientos, paradigma
logico, paradigma funcional...

Algunos conceptos basicos:
Que es una clase de objetos??Antes de explicar que es una clase dentro del paradigma de
objetos, pensemos en situaciones reales de la vida cotidiana. El ser humano, por naturaleza,
agrupa los objetos de la realidad en "clases de objetos". Por ejemplo, si hablo de un caballo, un
automovil, un omnibus, un avion y un tren.... podria agrupar todos esos objetos dentro de la
clase "medios de transporte". Es decir, aunque cada uno de ellos tenga caracteristicas
distintas, todos sirven para transportar personas. Algunos tendran ruedas, otros alas, el caballo
tendra piernas, etc.




Como vimos, el paradigma de objetos, es una manera de pensar o modelar un problema
determinado. Hay lenguajes de programacin orientados a objetos, como C++, Java, etc.Los
objetos son entidades que nos sirven para representar o modelar un problema concreto de la
realidad.Bajo estos conceptos mencionados, los objetos, son INSTANCIAS de una
determinada clase. Por ejemplo, el objeto "automovil" es una INSTANCIA de la clase "medios
de transporte". Los objetos son instancias de una determinada clase.Al tratar cada elemento
del problema como si fuera un objeto, y enumerar sus caracteristicas, podemos ver dos
grandes categorias: los objetos estan compuestos por dos cosas fundamentales:

Atributos:
Los atributos son las caracteristicas propias de cada objeto. por ejemplos: Persona: edad,
altura, sexo, direccion, telefono, nombre, apellido, peso, etc. Automvil: color, marca, modelo,
precio, velocidad maxima, etc. Una venta: cliente al que se le vendio, fecha, hora, total de la
venta, cantidad de productos, forma de pago, etc.Los atributos de un objeto en particular,
pueden cambiar el valor que contienen, por ejemplo, el atributo edad de un objeto Persona,
puede contener el valor 22 (la persona tiene 22 anios), pero obviamente ese valor puede variar
en cualquier momento. Los atributos no contienen valores estaticos o fijos, sino que contienen
valores que cambian (o pueden cambiar) constantemente. Obviamente hay atributos que no
cambian mucho, como por ejemplo el atributo sexo de un objeto persona, puede contener
"masculino" o "femenino" pero difcilmente cambie (aunque en estos dias todo es posible), otro
ejemplo seria el atributo "cantidad de ruedas" del objeto Motocicleta, que generalmente
contiene el valor 2. Los atributos son caracteristicas de los objetos, como vimos en los
ejemplos, son bastante sencillos de enumerar. Hay que tener en cuenta que, en funcion del
problema que estemos tratando de resolver, hay atributos que debemos descartar. Asi, si
estamos desarrollando una aplicacion para un supermercado, el objeto cliente, tendra atributos
como Nro. Cliente, nombre, telefono, etc (y hasta direccion de correo por si queremos enviarle
un mail para navidad). Pero en este caso, NO nos interesa el peso del cliente, su edad, su
presion arterial o el color de su piel (mientras que estos atributos podrian ser utiles si estamos
desarrollando una aplicacion para un sistema de historias clinicas, por ejemplo). Esta
posibilidad o habilidad de dejar de lado algunos atributos que no son relevantes para el
problema, y concentrarnos en los detalles mas importantes, recibe el nombre de Abstraccion
(pero de eso hablaremos mas adelante).

Metodos:
Los metodos, son acciones que los objetos son capaces de llevar a cabo. Por ejemplo, el
objeto "Automovil" puede tener un metodo llamado moverse() (los parentesis al final son una
manera de denotar un metodo), el cual modificara el atributo "ubicacion", o un objeto "Persona",
puede tener un metodo que se llame cumplirAnios(), este metodo, aumentara en una unidad el
valor el atributo edad. En el paradigma de objetos, se dice que los objetos se comunican entre
si, enviandose mensajes. Entenderemos ahora que son los mensajes.

Mensajes:
Un mensaje es una solicitud que se realiza a un objeto para que ejecute un bloque de codigo
determinado. Como es esto? Si recordamos todo lo que vimos hasta ahora podriamos resumir
lo siguiente: un objeto tiene atributos (que son las caracteristicas propias de cada objeto) y
metodos (acciones que el objeto puede llevar a cabo). Entonces, un mensaje es un pedido para
que el objeto ejecute uno de sus metodos. Veamos un ejemplo que unifique las tres ideas.

EJEMPLO PARA UNIFICAR IDEAS
El objeto en cuestion es el objeto Persona... este, tiene los siguientes atributos: Edad: 20
Nombre: Federico Alem Direccin: Chubut 19 fecha-nacimiento: 17/06/1986y ademas los
siguientes metodos: cumplirAnios() mudarse(nueva direccion) <---- notese que este metodo nos
pide la nueva direccion (mas adelante vamos a ver como funciona esto) fecha-nacimiento()El
primer mtodo, hara que el atributo Edad sume una unidad a su valor actual (cabe aclarar que
no puede tener un valor negativo, por ejemplo).El segundo metodo, hara que el atributo
Direccion cambie por el nuevo valor que le pasamos entre parentesis. Este valor se denomina
PARMETRO o ARGUMENTO. Es decir, el atributo tiene el valor "Chubut 19", pero si nosotros
llamamos al metodo mudarse("Corrientes 2315" ), este mismo tomara dicho valor pasado entre
parentesis.El tercer mtodo, nos devolvera la fecha de nacimiento de la persona. Es decir,
cuando lo llamemos, nos devolvera 17/06/1986.Ya que vimos los metodos y los atributos,
veamos como se implementan los mensajes. Para "enviarle" mensajes a un objeto se utiliza la
forma OBJETO.MENSAJE (objetoPUNTOmensaje), es decir, en nuestro ejemplo actual podria
darse ersona.cumplirAnios()o tambinPersona.fecha-nacimiento()Cuando un objeto recibe
un mensaje, busca dentro de sus metodos a aquel que coincida con el nombre del mensaje y
ademas con el numero y tipo de parametros. Veamos un ejemplo para esto. Sigueiendo el
ejemplo anterior, el objeto Persona tiene un metodo que se llama mudarse. Cuando este objeto
recibe el mensaje "mudarse" ==> Persona.mudarse("Chaco 882" ), entonces este objeto busca
dentro de sus metodos a aquel que se llame "mudarse", pero que ademas reciba SOLO UN
parametro, y que ademas, ESE PARMETRO SEA DE TIPO STRING (o cadena de
caracteres).Podria darse el caso de que dos metodos tengan el mismo nombre, pero tengan
cantidades distintas de argumentos... o teniendo el mismo numero de argumentos, estos sean
de tipos distintos. Por esto que acabamos de decir, todos los metodos descritos a continuacin
son distintos:mudarse("Chubut 1918" ) <== recibe 1 parametro de tipo Stringmudarse("Chubut",
1918) <== recibe 2 parametros, un String y un enteromudarse("Chubut", 1918, 1, "B" ) <==
recibe 4 parametros... el nombre de la calle, el numero de puerta, el nro de piso, y la letra de
departamento. (si vive en un edificio)Y asi muchos casos mas. Entonces, es facil notar, que
cuando un objeto recibe un mensaje, busca su metodo que coincida con la cantidad y tipo de
parametros recibidos. Asi, si escribimos Persona.mudarse("Corrientes 1918" ) el objeto
ejecutara su primer metodo, mientras que si escribimosPersona.mudarse("Buenos Aires", 2344,
4, "A" ), se llamara al tercer metodo, que recibe 4 parametros (un String, dos enteros, y otro
String al final)Hasta aca la primera parte de Programacion Orientada a Objetos. Cualquier
pregunta, sugerencia, critica o correccion es bienvenida, como asi tambien los
comentarios. Manual corto y basico de Programacion
Orientada a Objetos (hecho por mi)



Programacion Orientada a objetos: El termino "programacion orientada a objetos"
surge del hecho de realizar aplicaciones apoyandose en el paradigma de objetos. Antes que
nada... que es un paradigma?

Paradigma: "Paradigma es un modelo o patrn en cualquier disciplina cientfica u otro
contexto epistemolgico." (Wikipedia). Hablando mal y pronto, paradigma es una manera de
pensar el problema, y en funcion de ello, buscar una solucion. Por ejemplo, si pienso en una
factura (de esas que te dan cuando compras algo), e intento representarla basandome en el
paradigma de objetos, deberia pensarla como: un "objeto factura"... ese objeto tiene ciertas
caracteristicas (una fecha, un cliente, un numero de factura, una cantidad determinada de
productos, etc). Es decir, deberia pensar en la factura como un objeto compuesto por ciertas
caracteristicas. Ahora, dijimos que la factura tenia una determinada cantidad de productos,
entonces podriamos pensar a cada producto tambien como un objeto. El "objeto Producto"
tiene caracteristicas como: precio de costo, descripcion, proveedor, precio de venta, etc,
etc.Redondeando la idea, podemos ver que cada elemento de la realidad que nos rodea,
puede ser pensado como objetos (una persona: con caracteristicas como edad, nombre,
direccion, estado civil --- Un medio de transporte: con caracteristicas como: velocidad maxima,
capacidad maxima de pasajeros, costo, etc). El paradigma de objetos es la forma de pensar a
cada elemento del problema que tenemos que resolver, como si fuera un objeto. Existen otros
paradigmas, como el paradigma procedural (u orientado a los procedimientos, paradigma
logico, paradigma funcional...

Algunos conceptos basicos:
Que es una clase de objetos??Antes de explicar que es una clase dentro del paradigma de
objetos, pensemos en situaciones reales de la vida cotidiana. El ser humano, por naturaleza,
agrupa los objetos de la realidad en "clases de objetos". Por ejemplo, si hablo de un caballo, un
automovil, un omnibus, un avion y un tren.... podria agrupar todos esos objetos dentro de la
clase "medios de transporte". Es decir, aunque cada uno de ellos tenga caracteristicas
distintas, todos sirven para transportar personas. Algunos tendran ruedas, otros alas, el caballo
tendra piernas, etc.




Como vimos, el paradigma de objetos, es una manera de pensar o modelar un problema
determinado. Hay lenguajes de programacin orientados a objetos, como C++, Java, etc.Los
objetos son entidades que nos sirven para representar o modelar un problema concreto de la
realidad.Bajo estos conceptos mencionados, los objetos, son INSTANCIAS de una
determinada clase. Por ejemplo, el objeto "automovil" es una INSTANCIA de la clase "medios
de transporte". Los objetos son instancias de una determinada clase.Al tratar cada elemento
del problema como si fuera un objeto, y enumerar sus caracteristicas, podemos ver dos
grandes categorias: los objetos estan compuestos por dos cosas fundamentales:

Atributos:
Los atributos son las caracteristicas propias de cada objeto. por ejemplos: Persona: edad,
altura, sexo, direccion, telefono, nombre, apellido, peso, etc. Automvil: color, marca, modelo,
precio, velocidad maxima, etc. Una venta: cliente al que se le vendio, fecha, hora, total de la
venta, cantidad de productos, forma de pago, etc.Los atributos de un objeto en particular,
pueden cambiar el valor que contienen, por ejemplo, el atributo edad de un objeto Persona,
puede contener el valor 22 (la persona tiene 22 anios), pero obviamente ese valor puede variar
en cualquier momento. Los atributos no contienen valores estaticos o fijos, sino que contienen
valores que cambian (o pueden cambiar) constantemente. Obviamente hay atributos que no
cambian mucho, como por ejemplo el atributo sexo de un objeto persona, puede contener

"masculino" o "femenino" pero difcilmente cambie (aunque en estos dias todo es posible), otro
ejemplo seria el atributo "cantidad de ruedas" del objeto Motocicleta, que generalmente
contiene el valor 2. Los atributos son caracteristicas de los objetos, como vimos en los
ejemplos, son bastante sencillos de enumerar. Hay que tener en cuenta que, en funcion del
problema que estemos tratando de resolver, hay atributos que debemos descartar. Asi, si
estamos desarrollando una aplicacion para un supermercado, el objeto cliente, tendra atributos
como Nro. Cliente, nombre, telefono, etc (y hasta direccion de correo por si queremos enviarle
un mail para navidad). Pero en este caso, NO nos interesa el peso del cliente, su edad, su
presion arterial o el color de su piel (mientras que estos atributos podrian ser utiles si estamos
desarrollando una aplicacion para un sistema de historias clinicas, por ejemplo). Esta
posibilidad o habilidad de dejar de lado algunos atributos que no son relevantes para el
problema, y concentrarnos en los detalles mas importantes, recibe el nombre de Abstraccion
(pero de eso hablaremos mas adelante).

Metodos:
Los metodos, son acciones que los objetos son capaces de llevar a cabo. Por ejemplo, el
objeto "Automovil" puede tener un metodo llamado moverse() (los parentesis al final son una
manera de denotar un metodo), el cual modificara el atributo "ubicacion", o un objeto "Persona",
puede tener un metodo que se llame cumplirAnios(), este metodo, aumentara en una unidad el
valor el atributo edad. En el paradigma de objetos, se dice que los objetos se comunican entre
si, enviandose mensajes. Entenderemos ahora que son los mensajes.

Mensajes:
Un mensaje es una solicitud que se realiza a un objeto para que ejecute un bloque de codigo
determinado. Como es esto? Si recordamos todo lo que vimos hasta ahora podriamos resumir
lo siguiente: un objeto tiene atributos (que son las caracteristicas propias de cada objeto) y
metodos (acciones que el objeto puede llevar a cabo). Entonces, un mensaje es un pedido para
que el objeto ejecute uno de sus metodos. Veamos un ejemplo que unifique las tres ideas.

EJEMPLO PARA UNIFICAR IDEAS
El objeto en cuestion es el objeto Persona... este, tiene los siguientes atributos: Edad: 20
Nombre: Federico Alem Direccin: Chubut 19 fecha-nacimiento: 17/06/1986y ademas los
siguientes metodos: cumplirAnios() mudarse(nueva direccion) <---- notese que este metodo nos
pide la nueva direccion (mas adelante vamos a ver como funciona esto) fecha-nacimiento()El
primer mtodo, hara que el atributo Edad sume una unidad a su valor actual (cabe aclarar que
no puede tener un valor negativo, por ejemplo).El segundo metodo, hara que el atributo
Direccion cambie por el nuevo valor que le pasamos entre parentesis. Este valor se denomina
PARMETRO o ARGUMENTO. Es decir, el atributo tiene el valor "Chubut 19", pero si nosotros
llamamos al metodo mudarse("Corrientes 2315" ), este mismo tomara dicho valor pasado entre
parentesis.El tercer mtodo, nos devolvera la fecha de nacimiento de la persona. Es decir,
cuando lo llamemos, nos devolvera 17/06/1986.Ya que vimos los metodos y los atributos,
veamos como se implementan los mensajes. Para "enviarle" mensajes a un objeto se utiliza la
forma OBJETO.MENSAJE (objetoPUNTOmensaje), es decir, en nuestro ejemplo actual podria
darseersona.cumplirAnios()o tambinPersona.fecha-nacimiento()Cuando un objeto recibe un
mensaje, busca dentro de sus metodos a aquel que coincida con el nombre del mensaje y
ademas con el numero y tipo de parametros. Veamos un ejemplo para esto. Sigueiendo el
ejemplo anterior, el objeto Persona tiene un metodo que se llama mudarse. Cuando este objeto
recibe el mensaje "mudarse" ==> Persona.mudarse("Chaco 882" ), entonces este objeto busca
dentro de sus metodos a aquel que se llame "mudarse", pero que ademas reciba SOLO UN
parametro, y que ademas, ESE PARMETRO SEA DE TIPO STRING (o cadena de
caracteres).Podria darse el caso de que dos metodos tengan el mismo nombre, pero tengan
cantidades distintas de argumentos... o teniendo el mismo numero de argumentos, estos sean
de tipos distintos. Por esto que acabamos de decir, todos los metodos descritos a continuacin
son distintos:mudarse("Chubut 1918" ) <== recibe 1 parametro de tipo Stringmudarse("Chubut",
1918) <== recibe 2 parametros, un String y un enteromudarse("Chubut", 1918, 1, "B" ) <==
recibe 4 parametros... el nombre de la calle, el numero de puerta, el nro de piso, y la letra de
departamento. (si vive en un edificio)Y asi muchos casos mas. Entonces, es facil notar, que
cuando un objeto recibe un mensaje, busca su metodo que coincida con la cantidad y tipo de
parametros recibidos. Asi, si escribimos Persona.mudarse("Corrientes 1918" ) el objeto
ejecutara su primer metodo, mientras que si escribimosPersona.mudarse("Buenos Aires", 2344,
4, "A" ), se llamara al tercer metodo, que recibe 4 parametros (un String, dos enteros, y otro
String al final)Hasta aca la primera parte de Programacion Orientada a Objetos. Cualquier
pregunta, sugerencia, critica o correccion es bienvenida, como asi tambien los comentarios.

Manual corto y basico de Programacion
Orientada a Objetos (hecho por mi)

Lo que vimos hasta ahora
En la primera parte de este post (http://www.taringa.net/posts/apuntes-y-
monografias/10716721/Programacion-Orientada-a-Objetos_-Corto-y-Basico_-Parte-
1.html) hemos visto conceptos basicos del paradigma de objetos tales como: que es una clase,
que es un objeto, que es un mensaje, etc. En esta parte, voy a explicar conceptos un poco mas
avanzados, como por ejemplo la HERENCIA y el POLIMORFISMO, como asi tambien que es
un metodo, un evento, la diferencia entre metodo y mensaje, la abstraccion, el
encapsulamiento, la modularidad, la recoleccion de basura, entre otros.

Conceptos necesarios antes de empezar

Diferencia entre Metodo y Mensaje. Que es un Evento
Como habiamos visto en la primera parte de este post, un Metodo, es un bloque de codigo
encargado de realizar alguna tarea especifica. Por ejemplo, un objeto de la clase Medios de
Transporte podria ser un automovil. Veamos como se compone este objeto Automovil

OBJETO AUTOMOVIL:
Atributos:
- Capacidad_de_personas
- Velocidad_Actual
- Velocidad_Maxima
- Cantidad_de_ puertas
Metodos:
+ Acelerar(cuantos_km/h)
+ Detenerse()
+ Ir_a(lugar) .....

.....Como vemos en este ejemplo, el objeto Automovil esta compuesto por Atributos y Metodos.
Como dijimos, los metodos son bloques de codigo encargados de realizar alguna tarea
especifica. Para ejemplificar esto, vamos a ver el codigo del metodo Acelerar(cuantos_km/h)...

Acelerar(cuantos_km/h){
Velocidad_Actual = Velocidad_Actual + cuantos_km/h ;
}

Este metodo es el encargado de aumentar la velocidad del objeto Automovil, es decir, tiene un
bloque de codigo que aumenta en "cuantos_km/h" unidades la velocidad actual del
objeto.Entonces.... un metodo es una pequena porcion de codigo que generalmente modifica el
estado interno del objeto (sus atributos), y digo "generalmente" porque podria no siempre lo
hace... un metodo podria simplemente ser el encargado de mostrar un mensaje por pantalla, o
devolver ciertos valores, etc. Ahora... cual es la diferencia entre un metodo y un mensaje?? Es
simple, un metodo es la IMPLEMENTACION DE UN MENSAJE. Como es esto? Un mensaje
es una solicitud a un objeto para que ejecute alguno de sus metodos. Cuando escribimos
Automovil.Acelerar(32), lo que estamos haciendo es decirle al objeto Automovil que aumente
su velocidad en 32 unidades, mediante la ejecucion del metodo Acelerar(cuantos_km/h).
Cuando un objeto recibe un mensaje, busca entre sus metodos aquel que coincida con el
NOMBRE DEL MENSAJE, LA CANTIDAD DE PARAMETROS, y el TIPO DE DATOS DE
ESOS PARAMETROS. Es decir, si encuentra al metodo que coincida exactamente con esas
tres cosas, lo ejecutara. A esto se denomina FIRMA DEL MENSAJE, o SIGNATURA DEL
MENSAJE (nombre, cantidad de parametros y tipo de datos de los mismos).

Evento
La programacion orientada a objetos no necesariamente necesita de eventos. Un evento es
una accion que ocurre en un momento determinado del tiempo, ya sea por accion del usuario,
o porque la propia PC lo genera. Por ejemplo, cuando hacemos click con el mouse... eso es un
evento, cuando presionamos una tecla del teclado... eso es un evento, cuando minimizamos
una ventana... eso es un evento, etc, etc, etc. Es asi que cada accion que llevamos a cabo en
la PC es tomado por la misma como un evento. Pero tambien existen eventos generados por la
PC, como por ejemplo, la finalizacion de un determinado lapso de tiempo (temporizador).Que
tiene que ver esto con la POO?? Muy simple, la POO se utiliza generalmente de manera
conjunta o acompanada de la PROGRAMACION GUIADA POR EVENTOS. Cuando un evento
ocurre, se invoca a un metodo determinado. Por ejemplo, cuando hago click en el boton
Minimizar de cualquier ventana, se envia un Mensaje al objeto VENTANA para que ejecute su
metodo Minimizar()... Mas simple imposible!

Abstraccion
La abstraccion es una propiedad que permite en programacion, tomar informacion relevante, y
descartar aquellos detalles que no son importantes en el ambito del problema. Es decir,
pensemos que debemos contruir una clase que se llame Pacientes, para una aplicacion de un
consultorio medico (de esos tipicos que usan las secretarias para asignar turnos). Pensariamos
entonces en que propiedades de los pacientes nos interesan... Edad, Peso, Antecedentes
medicos, Altura, Direccion (para enviarle una linda postal a fin de anio), y Telefono. Si
observamos bien, todos estos ATRIBUTOS del objeto PACIENTE son relevantes para un
consultorio medico. Nos interesaria agregar el ATRIBUTO Ingresos_Mensuales?? Y... la
verdad que no, para que querria un medico tener dicha informacion (dejemoslo ahi jaja). En
conclusion, la abstraccion nos permite centrarnos en los detalles inherentes al problema,
dejando de lado detalles que no lo son. Tambien se denomina abstraccion a una propiedad que
tienen los METODOS. Cuando hablabamos del metodo Acelerar(cuantos_km/h), sabiamos que
si lo llamabamos, y le pasabamos una velocidad determinada entre parentesis, el objeto
Automovil aceleraria. Pero nada sabiamos acerca de como lo hace... es decir, la forma en que
este metodo lleva a cabo su tarea es irrelevante (si tuvieramos un empleado que nos prepara el
desayuno todas las mananas, nos daria lo mismo que preparara primero el cafe, y luego
agregue mermelada a las tostadas o viceversa, siempre que el desayuno llegue caliente y
delicioso a la cama... no es asi??) Entonces, no deberia importar como un metodo lleva a cabo
su tarea, sino que la realice correctamente. El metodo anterior:Acelerar(cuantos_km/h){
Velocidad_Maxima = Velocidad_Maxima + cuantos_km/h ;}tranquilamente pudo haber sido
asi:Acelerar(a_que_velocidad){ Velocidad_Actual = a_que_velocidad ;}Es decir, no nos interesa
la forma en que el metodo realiza su tarea... lo unico que nos interesa es que ese metodo
acelera la velocidad del objeto automovil. A este "ocultamiento de detalles" se denomina
tambien abstraccion. Algunos autores llaman a esto ENCAPSULAMIENTO y a veces se suelen
confundir, pero basicamente, el concepto es el mismo (o puede encontrarse con ambos
nombres).

Herencia
Y por fin llegamos al concepto de herencia, uno de los mas faciles de explicar, pero que trae
aparejado muchos otros conceptos.Sin entrar en POO, pensemos en el concepto de Herencia
(sin ser la economica). Cuando nacemos, tenemos ciertas caracteristicas, que segun nuestros
padres heredamos de alguno de los dos (eventualmente de los abuelos) como por ejemplo el
color de ojos, el caracter, la altura, ciertas destrezas, etc. En POO sucede lo mismo con las
clases de objetos... ciertas clases heredan de otras, metodos y atributos, conformandose asi
una JERARQUIA DE CLASES... pero vamos despacio: Pensemos en la clase
MediosDeTransporte:

MediosDeTransporte{
Atributos:
- velocidadMaxima;
- capacidadPersonas;
- autonomia;
- tipoCombustible
Metodos:
+ Acelerar(cuantos_km/h)
+ Detenerse()
+ Ir_a(lugar)
}

Esta clase servira como CLASE BASE o CLASE PADRE para otras. Esto quiere decir que
podemos hacer otras clases que contengan todos los metodos y atributos que la anterior,
PERO QUE ADEMAS TENGAN METODOS Y ATRIBUTOS PROPIOS. Veamos dos ejemplos
de clases que hereden de la clase MediosDeTransporte...

Caballo{
Atributos:
- velocidadMaxima;
- capacidadPersonas;
- autonomia;
- tipoCombustible
- Raza
- Edad
Metodos:
+ Acelerar(cuantos_km/h)
+ Detenerse()
+ Ir_a(lugar)
+ ComerPasto
+ Dormir
}

Motocicleta{
Atributos:
- velocidadMaxima;
- capacidadPersonas;
- autonomia;
- tipoCombustible
- Marca
- Cilindrada
Metodos:
+ Acelerar(cuantos_km/h)
+ Detenerse()
+ Ir_a(lugar)
+ RealizarMantenimiento
+ EncenderLuces
}

Creo que en el ejemplo quedo mas que claro... la herencia se utiliza para dos cosas
fundamentales. Primero, para ahorrarse el trabajo de programar o codificar dos clases que
tienen los mismos metodos y atributos, haciendolo solo una vez en la clase PADRE, y luego
declarando en las clases HIJAS que heredan de su PADRE. Con esto se consigue que una
clase tenga los mismos metodos y atributos que su padre, pero que ademas pueda agregar los
suyos. La otra finalidad que persigue la herencia es una correcta organizacion en la Jerarquia
de Clases, haciendo mas entendible el modelado del problema.
ACLAREMOS CIERTAS COSAS:
Cuando una clase PADRE tiene un metodo (por ejemplo Acelerar(cuantos_km/h)), la clase
HIJA puede modificar varias cosas: por un lado, puede dejar intacta la firma del metodo
(nombre y cantidad y tipo de parametros) pero modificar su funcionamiento interno, es decir,
cambiar la forma en la que el metodo cumple con su tarea. Este mecanismo se conoce
como ESPECIALIZACION debido a que las clases hijas, ESPECIALIZAN la forma de actuar de
los metodos heredados. Por ejemplo, si en la clase PADRE MediosDeTransporte existe un
metodo denominado CargarCombustible... pensemos que si una clase HIJA llamada Automovil
debe hacerlo, debera incrementar el numero de litros de combustible en su deposito, mientras
que si pensamos en una clase HIJA llamada Caballo, deberiamos incrementar el numero de
kilogramos de pasto en su estomago (que ocurrente el ejemplo no? jaja). Es asi que las clases
HIJAS que HEREDAN de sus clases PADRES pueden ESPECIALIZAR ciertos metodos en
funcion de las necesidades especificas de cada una de ellas.Ademas de modificar solo el
funcionamiento de un metodo heredado, las clases HIJAS tambien pueden modificar la
cantidad y/o el tipo de parametros que recibe dicho metodo, manteniendo intacto el nombre del
mismo. A este metodo se lo denominaSOBRECARGA DE METODOS, y se da cuando una
clase HIJA cambia la cantidad y/o los tipos de parametros que este recibe.Pueden existir en
una clase dos metodos con el mismo nombre, pero ambos difieren en el tipo y/o cantidad de
parametros que reciben, entonces se dice que ese metodo esta SOBRECARGADO. Cuando
un objeto recibe un mensaje, buscara entre sus metodos (y ejecutara) aquel que coincida en el
nombre, pero ademas en el tipo y la cantidad de parametros.Supongamos que un objeto recibe
un mensaje cualquiera... AUTOMOVIL.ACELERAR(20km/h)... que sucede si este objeto no
cuenta con un metodo que coincida en el nombre o en el tipo y cantidad de parametros??
Buena pregunta no? Lo que sucede en este caso es que el objeto empezara a buscar entre sus
propios metodos, y si no lo encuentra lo buscara entre los metodos de su clase padre... y si no
lo encuentra buscara entre los metodos de su clase abuelo... y asi sucesivamente hasta llegar
a la clase RAIZ. En caso de no encontrar el metodo, devolvera un error diciendonos que ese
metodo no ha sido encontrado. A este mecanismo de busqueda hacia arriba en la jerarquia de
clases se denomina LOOK-UP o simplemente "Busqueda hacia arriba".

Modularidad
Este concepto es mas sencillo, y viene del viejo dicho "DIVIDE Y TRIUNFARAS". Se trata de
un concepto que implica dividir el GRAN problema en muchas partes PEQUENAS, a fin de que
cada una de ellas sea mas facil de manejar y sea o este especializada en una tarea particular.
Pensemos en la construccion de un edificio, donde cualquier persona hace lo que quiere... el
arquitecto colocando los ceramicos, el electricista pintando las paredes... seria un completisimo
desastre no? En la POO pasa lo mismo. Cuando modelamos una serie de clases de objetos,
con sus respectivos metodos y atributos, debemos pensar en dividir el problema en muchas
partes pequenas... siguiendo el ejemplo del edificio deberiamos pensar en una clase "Obreros"
y dentro de ella SUBCLASES o CLASES HIJAS que se encarguen respectivamente de colocar
ceramicos, otra de preparar el cemento, otra de armar las columnas, etc... mientras otra clase
Electricista tendra SUBCLASES que se encargaran de pasar cables, otras de colocar
lamparitas, etc. Este concepto nos estimula a organizar las clases para que el modelado sea:
mas entendible, mas util, y con menor redundancia, logrando el desempeno optimo y una mejor
especializacion de cada clase.

Recoleccion de Basura
Tambien denominado Garbage Collector, es un metodo de "limpieza de memoria". Cuando
corremos una aplicacion que respeta el paradigma de objetos, cada objeto que es creado
durante la ejecucion va a parar a memoria principal... entonces, que pasaria si ejecutamos
nuestra aplicacion un tiempo prolongado?? la respuesta mas sencilla seria "La memoria se va a
llenar y ya no se podran seguir cargando objetos en ella". Es por esto, que existe lo que se
denomina Recolector de Basura, y consiste en un mecanismo de eliminacion de objetos que ya
no se utilizan en memoria con el objeto de optimizar el uso de la misma.

POLIMORFISMO
Que raro suena esto... no?
Aunque suene raro, su definicion es bastante simple... El POLIMORFISMO es la capacidad que
tienen objetos de diferentes clases de responder a mensajes con el mismo nombre.
Ejemplifiquemoslo:

Una clase CAJA_AHORRO: posee el metodo extraerDinero(cuanto)
Una clase CUENTA_CORRIENTE: tambien posee el metodo extraerDinero(cuanto)

Tengamos en cuenta que las dos clases son totalmente distintas. Solo a MODO DE EJEMPLO
vamos a decir que cuando extraemos dinero de una CAJA_AHORRO se resta el monto que
extraemos del dinero disponible en ella (como lamentablemente sucede en la realidad jaja)...
mientras que si extraemos dinero de una CUENTA_CORRIENTE, ademas de restarse el dinero
que extraemos, el banco nos cobra una comision de $10. Vamos a ver como podrian ser estos
metodos:
-----------------------------------------------------------------------------------------------------
Metodo extraerDinero(cuanto) de la clase CAJA_AHORRO:
extraerDinero(cuanto){
saldoDisponible = saldoDisponible - cuanto;
}
-----------------------------------------------------------------------------------------------------
Metodo extraerDinero(cuanto) de la clase CUENTA_CORRIENTE:
extraerDinero(cuanto){
saldoDisponible = saldoDisponible - cuanto - 10;
}
-----------------------------------------------------------------------------------------------------

Ahora, supongamos que tenemos que hacer el balance diario de los movimientos de todas las
cuentas del banco, y para ello, vamos leyendo de un archivo una por una las cuentas (ya sean
cajas de ahorro o cuentas corrientes).

He aqui donde aparece el POLIMORFISMO.... Primero leo una cuenta a la vez del archivos de
cuentas y lo guardo en un objeto...

nuevaCuenta = cuentas.leerSiguiente()

y ahora magicamente puedo hacer lo siguiente:

nuevaCuenta.extraerDinero(cuanto)

La pregunta es... Como puedo saber si la cuenta que lei del archivo es una CAJA_AHORRO o
una CUENTA_CORRIENTE??

La respuesta es simple: NO ME INTERESA!! Porque ambas clases poseen el metodo
extraerDinero(cuanto), mas alla que cada una de ellas haga cosas distinas. Entonces, el
POLIMORFISMO, como dije antes, es la capacidad que tienen objetos de diferentes clases de
responder a mensajes con el mismo nombre, lo cual es extremadamente util en ciertas
ocaciones (como en el ejemplo anterior).
Un mensaje con la misma firma puede ser entendido por objetos de distintas clases, aunque
cada uno de ellos tenga un metodo asociado distinto. Recordemos que un metodo es la
implementacion de un mensaje, por lo tanto cada una de las clases tendra maneras distintas de
implemetar dicho mensaje, pero con seguridad sabemos que lo entendera.

Bueno, con esto creo que queda bastante mas claro y mas completo el primer post. De todas
maneras, y como dije antes, cualquier consulta no duden en preguntarme en los comentarios y
respondere alli, de tal manera que todos puedan ver la pregunta y la respuesta. Espero
haberme explicado bien y que les haya servido.

Que son las funciones
Las funciones son bloques de codigo encargados de realizar una tarea determinada, y como
resultado devuelven un valor. Este valor puede ser numerico, una cadena de texto, de tipo
booleano, etc.
Un claro ejemplo de como funciona una funcion (valga la redundancia) es el de calcularEdad()
Suele suceder que entre los datos que manejamos en una aplicacion tengamos la fecha de
nacimiento de un cliente, paciente, etc. Sabemos que esos datos van a permanecer en nuestra
aplicacion durante un tiempo bastante prolongado, por lo que guardar la edad no seria factible,
ya que al pasar un anio, dicho dato seria erroneo, y tambien seria tedioso tener que actualizar
la edad de cada cliente de nuestra base de datos una vez por anio. Para casos como este (y
muchos otros) existen las funciones, que como dije antes, reciben ciertos parametros (o
argumentos), realizan cierto procesamiento y devuelven un resultado que puede ser de algun
tipo de datos en particular. Veamos este ejemplo...

DATOS DE NUESTRO CLIENTE:
Nro. de Cliente: 100
Nombre: Federico Alem
Domicilio: Chubut 1918
Fecha de Nacimiento: 17/06/1986

En alguna parte de la aplicacion supongamos que queremos mostrar la leyenda

EL CLIENTE NRO. XXX SE LLAMA XXXX, VIVE EN XXXXX Y TIENE XX ANIOS.

La pregunta seria... Como calculo la edad? Para ello disponemos de las funciones. Esta podria
ser:

Public Function calcularEdad(byVal fecNac as Date) as Integer
Dim edad as integer
edad = date.today().year - cliente.fecNac().year
Return edad
End Function

O lo que podria ser mas corto...

Public Function calcularEdad(byVal fecNac as Date) as Integer
Return (date.today().year - cliente.fecNac().year)
End Function

(en el ejemplo use la sintaxis de Visual Basic... hace un tiempo que no programo en ese
lenguaje asi que perdon por algun posible error de sintaxis, pero creo que la idea se entiende)

Notese que en el primer ejemplo, se define una funcion que se llama calcularEdad y como
argumento recibe por valor (esto lo explico mas adelante) una variable de tipo Date (o fecha).
De este valor, que posiblemente tenga esta forma DD/MM/AAAA se rescata solo la parte final
(AAAA), es decir el anio de nacimiento. La resta entre este valor y el anio actual se guarda en
una variable de tipo Integer (del mismo tipo de dato que el valor que devuelve la funcion).
Luego obviamente se lo retorna mediante Return.
Sin embargo, en el segundo ejemplo no se define una variable, por lo que el tipo de dato se
"induce", es decir, si resto un numero entero con otro numero entero, el resultado sera... Y SI!!!
Otro numero entero. Hay que tener cuidado de retornar siempre el mismo tipo de dato que se
declaro en la firma de la funcion, ya que pueden pasar dos cosas:
1) El tipo de datos que intentamos retornar es el mismo que el declarado en la funcion... TODO
FUNCIONA
2) El tipo de datos que intentamos retornar NO es el mismo que el declarado en la funcion... en
este caso, el compilador intentara convertir el valor que estamos intentando retornar a Integer
(esto funciona si le pasamos un double, single o hasta un string con numeros), pero si le
pasamos otro tipo de datos NO CONVERTIBLE a enteros, nos dara error... OJO CON ESO!!

PROCEDIMIENTOS: Paso por valor y por referencia
Cuando llamamos a un procedimiento, generalmente le pasamos valores como argumentos.
Estos pueden ser por valor o por referencia. Cual es la diferencia? (me salio un verso sin
esfuerzo... jaja estoy re chistoso hoy)

Supongamos la siguiente situacion... Tenemos un objeto llamado Cliente con atributos Nombre
y Edad
Este objeto esta almacenado en memoria principal
si llamamos a un metodo y le pasamos el atributo edad POR VALOR, se creara una copia del
valor del Atributo Edad en memoria (es decir, en otro lugar de memoria) por lo que cualquier
cambio que hagamos con ese valor, no afectara al valor real del atributo Edad, ya que estamos
manejando una COPIA DE ESE VALOR EN MEMORIA. Por el contrario, si pasamos el valor
del atributo Edad por REFERENCIA, lo que hacemos realmente es pasar como argumento la
direccion fisica de donde se encuentra el atributo Edad, por lo que cualquier cambio que
realicemos a este valor TAMBIEN AFECTARA O HARA CAMBIAR el valor del atributo. Espero
haberme explicado correctamente. Cualquier duda... ya saben.