Download PROGRAMACION ORIENTADA A OBJETOS

Document related concepts

Polimorfismo (informática) wikipedia , lookup

Rust (lenguaje de programación) wikipedia , lookup

Common Lisp wikipedia , lookup

Objeto inmutable wikipedia , lookup

C Sharp wikipedia , lookup

Transcript
PROGRAMACION ORIENTADA A OBJETOS
Vivimos en un mundo de Objetos. Cada objeto tiene sus atributos y
operaciones.....
El texto anterior es parte una definicion de objetos, de los que
hablaremos a lo largo de este Tutorial. Pretende ser un herramienta de
ayuda al alumno principalmente, en el area Técnica de la computación.
Dentro de este ciberespacio de información abordaremos temas como:
¿Qué es un Objeto?, ¿Qué es una clase?, ¿Qué es una clase Base?. Y
dejaremos completamente claro y bien definido el objeto y sus partes
principales, asi como la abstraccion de datos.
Posteriormente hablaremos de como utilizar estas clases de objetos
creando programas fuente que son explicados línea a línea para mayor
comprensión de la tarea que ejecutan.
También hablaremos de los tipos de funciones de la Programación
Orientada a Objetos, como lo son los Constructores, Destructores,
Funciones Amigas, Espacios de nombres, Funciones Virtuales y
Operadores Amigos.
Las practicas de programas y código fuente estan orientadas al lenguaje
de programación C++, ya que es un lenguaje que incluye todo el soporte
para desarrollo de objetos, pero claro, existen otros lenguajes orientados
a objetos como lo es: Eiffel, SmallTalk, Pascal, ObjetiveC, etc..
Esperamos que este ciberviaje, te ayude sobre todo como apoyo a tus
estudios de programación....
¿ Que es la programación orientada a objetos?.
La Programación Orientada a Objetos (POO) es una forma de enfocar la tarea de
programación. Los enfoques de la programación han cambiado drásticamente
desde la invención de las computadoras, la creciente complejidad de los
programas, antes se realizaban mediante una consola las instrucciones máquina
en binario. Esto funcionaba porque los programas sólo tenían unos pocos cientos
de instrucciones. Cuando crecierón los programas, se invento el lenguaje
ensamblador para que el programador pudiera manejar programas más largos y
complejos usando una representación simbólica de las instrucciones máquina.
Los lenguajes de alto nivel aparecierón para proporcionar al programador más
herramientas con las cuales gestionar esa complejidad. En los años sesenta nace
la programación estructurada, este es el método alentando por varios lenguajes
como pascal, y C. Con los lenguajes estructurados fue posible escribir programas
moderadamente complejos de una forma bastante sencilla. Sin embargo, usando
incluso la programación estructurada, cuando los proyectos Alcanzan cierto
tamaño, su complejidad se vuelve demasiado difícil para ser controlada por un
programador.
La Programación Orientada a Objetos toma las mejores ideas de la programación
estructurada la combina con nuevos y poderosos conceptos que animan o alientan
una nueva visión de la tarea de la programación. La Programación Orientada a
Objetos permite descomponer fácilmente un problema en subgrupos de partes
relacionadas. Entonces, puede traducir estos subgrupos en unidades
autocontenidas llamadas Objetos.
Evolución de la programación
POO (Programación Orientada a Objetos)es un importante conjunto de
técnicas que se pueden utilizar para hacer el desarrollo de programas más eficientes
mientras se mejora la facilidad de los programas resultantes. En esencia, POO es un
nuevo medio de enfocar el trabajo de programación. Sin embargo, a fin de
comprender lo que es la POO,es necesario comprender sus raíces. Así pues,
comenzaremos por examinar la historia del proceso de programación analizada cómo
evolución POO y deduciendo, en consecuencia, por qué es tan importante este
concepto.
Programación lineal.
Los lenguajes de programación lineal (BASIC,COBOL Y FORTRAN) no tenían
facilidad para reutilizar el código existente de programas. De hecho se duplicaban
segmentos de software cada vez más en muchos programas. Los programas se
ejecutaban en secuencias lógicas, haciendo la lógica difícil de comprender. El control
de programas era difícil y se producían continuos saltos a lo largo del referido
programa. Aún más, los lenguajes lineales no tenían capacidad de controlar la
visibilidad de los elementos llamados datos.
Programación Modular
El soporte más elemental de la programación Modular llegó con la aparición de la
subrutina. Una subrutina ha creado una secuencia de instrucciones a las que se les
da un nombre independiente; una vez que se ha definido, la subrutina se puede
ejecutar simplemente incluyendo el nombre del programa siempre que se
requiera. Las subrutinas proporcionan una división natural de las tareas;
diferentes programas utilizan. Aunque las subrutinas proporcionan el mecanismo
básico de la programación Modular, se necesita mucha disciplina para crear
software bien estructurado. Sin esta disciplina, es facil escribir programas compilados
y tortuosos difíciles de modificar y comprender, así como imposible de mantener. Esta
ha sido la panoramica durante muchos años en el desarrollo del software.
Programación Estructurada.
Un concepto importante en campo de la programación Estructurada: Abstracción,
ya que la
Abstracción se puede definir como la capacidad de examinar algo sin preocuparse
de los detalles internos. En un programa estructurado, es suficiente conocer que un
procedimiento sea fiable, para que se pueda utilizar sin tener que conocer cómo
funciona su interior. Esto se conoce como una Abstracción funcional y es el núcleo de
la programación estructurada. Hoy casi todos los lenguajes de programación tienen
construcciones que facílitan la programación estructurada.
OBJETO
¿Que es la progamación en POO?
La respuesta a esta pregunta es que cualquier entidad lógica del mundo real que se
pueda imaginar, como:
Objetos fisicos
Automóviles
Aviones
Animales Mamíferos
Los objetos soportan una serie de características especificas de los mismos:
Se agrupan en grupos denominados clases
Contienen datos internos que definen su estado actual.
Soportan ocultamiento de datos.
Pueden heredar propiedades de otros objetos.
Pueden comunicarse con otros objetos enviando o pasando
mensajes.
Tienen métodos que definen su comportamiento
Un objecto es una entidad lógica que contiene datos y un código especial que indica
como manipular los datos.
El uso de un objeto impone a veces castigos al momento de la ejecucion que en
ocaciones pueden degradar seriamente el diseño de un programa.
Los objetos son construcciones de programación que se obtienen a partir de cosas
llamadas clases. El programador tiene la responsabilidad absoluta de crear clases
propias, pero también puede tener acceso a las clases desarrolladas por otros.
Ejemplo: diseño de un Objeto.
Clase Objeto
class nomina {nomina empleado;
char nombre[30];
float salario;
};
(nomina es una clase )
(empleado es un objeto)
Los objetos son ejemplos de clases.
Una clase es un tipo especial de datos, y esta orientada a la creación de objetos y que
consta de unos miembros que pueden ser datos o funciones privadas o publicas.
Componentes de una Clase
Para poder definir una clase se debe tomar en cuenta que consta de dos partes: una
declaración y una implementación. La declaración lista los miembros de la clase. La
implementación o cuerpo define las funciones de la clase.
Clase Objeto
class nomina {nomina empleado;
char nombre[30];
float salario;
};
(nomina es una clase )
(empleado es un objeto)
Declaración de una clase
class contador{
long cuenta;
public:
void leervalor(long);
long obtenervalor( );
};
funciones miembro
Implementación de una clase
void
{
contador::leerValor(long valor)
cuenta = valor,
}
long Contador::obtenerValor( )
{
return cuenta;}
}
Componentes de una definición de una clase
CLASE
Una clase es un tipo de dato que contiene uno o más elementos dato llamados
miembro dato, y cero, una o más funciones que manipulan esos datos (llamados
miembro función o funciones miembros). Una clase se puede definir con una
estructura (estruct), una unión (unión) o una clase class.
La sintaxis de una clase es:
class nombre_clase
{
miembro_1;
//lista miembro
miembro_2;
miembro_3;
funcion_miembro_1( );
// funciones miembro conocidas
funcion_miembro_2( );
//funciones como métodos
};
Los objetos o instancias de una clase se definen así:
Nombre_class_instancia_1;
Un puntero o referencia a un objeto proporciona medios indirectos para acceder a un
objeto, sin embargo, el puntero o la propia referencia no es una instancia de una clase.
Y una clase es sintacticamente igual a una estructura, con la única diferencia de que
en el tipo class todos los miembros son por defecto privados mientras que en el
tipo struct son por defecto publicas.
Así la estructura fecha antes declarada, se puede declarar con class:
class fecha{
int día;
int mes;
int anyo;
};
MENSAJES: Activación de Objetos
La comunicación con el objeto se realiza a través del paso de mensajes. <<El
envío de un mensaje a una instancia de una clase produce la ejecución de un
método ( función miembro en C++) >>. El paso de mensajes es el termino utilizado
para referirnos a la invocación o llamada de una función miembro de un objeto. La
noción de paso de mensajes es fundamental en todos los lenguajes de
programación Orientada a Objetos.
Algunos ejemplos típicos de clases en las interfaces gráficas de usuarios, son los
populares botones en interfaces Windows.
A diferencia de los métodos tradicionales, cuyos elementos dato son pasivos, los
objetos pueden ser activados mediante la recepción de mensajes es simplemente
una petición de un objeto a otro objeto para que este se comporte de una
determinada manera, ejecutado uno de sus métodos. La técnica de enviar
mensajes se conoce como paso de mensajes.
Estructuralmente, un mensaje consta de tres partes: la identidad del objeto
receptor, cuya ejecución se ha solicitado y cualquier otra información adicional que
el receptor pueda necesitar para ejecutar el método requerido. Esta información
suele darse en forma de parámetros.
"T1 Imprimir Hola Mundo"
receptor método parámetros
En el caso de C++, la notación utilizada es
Nombre_del_objeto.función_miembro o método
Así en el caso de un objeto T1 (miembros dato: nombre de un alumno y curso en
que esta matriculado; miembro función: leerNombre, obtiene el nombre del alumno
e imprimir, visualiza el citado nombre), que recibe un mensaje Imprimir.
Los mensajes juegan un papel vital en POO; sin ellos, los objetos que se definen
no se podrían comunicar con otros objetos. Desde un punto de vista convencional,
el paso de mensajes no es más que el sinónimo de llamada a una función. De
hecho, esto es lo que sucede cuando un mensaje se envia a un programa POO.
La herencia es propiedad que permite a los objetos construirse a partir de otros
objetos. El concepto de herencia está presente en nuestras vidas diarias donde
las clases se dividen en subclases.
La herencia permite entonces describir entidades (clases) por diferencia entre
ellas; por eso se dice que programar con orientación a objetos es programar para
diferenciar. La utilidad de la herencia es múltiple. En primer lugar hay que analizar,
diseñar, codificar y poner a punto, que en cuanto se tiene un concepto definido,
jamás lo repetimos. Como muchos, si el concepto nuevo es muy parecido a uno
anterior, se define el nuevo como la diferencia respecto al anterior. Si surge un
error en la utilización de la nueva entidad, seguro que el error está en lo que se ha
añadido por que lo que se ha heredado ya se había producido.
Hay diferentes tipos de herencia: los más importantes son simples y múltiples.
Con esto se quiere decir que, al contrario de la herencia biológica donde siempre
se hereda de dos padres, en la programación orientada a objetos se puede
heredar de uno, dos o más padres.
La definición de cliente minorista a partir de cliente es un ejemplo de herencia
simple. Y se podria definir un vehiculo anfibio como una herencia (subclase) de
otras dos clases: coche y barco.
Es posible que todas las descripciones anteriores sean interesantes, pero sólo los
detalles que se ofrecen a traves de un programa real demuestran que es la
herencia y como funciona. Además aquí se muestra un breve ejemplo de dos
clases, donde la segunda de ellas hereda propiedades de la primera.
class box{
public:
int width,heigth;
void SetWidth(int w) {width = w;}
void SetHeigth(int h) {heigth = h; }
};
class ColoredBox: public Box{
public:
int color;
void SetColor(int c) {coor =c;}
};
La clase Box recibe el nombre de clase de base de la clase ColoredBox que a su
vez recibe el nombre de clase derivada. A si mismo, las clases base denominadas
a veces clases protegidas o primarias. La clase ColoredBox se declara solo con
una función, pero también hereda dos funciones y dos variables de su clase base.
Así, se puede crear el codigo siguiente:
//haga una instancia de
ColoredBox cb;
Void main( )
{
//utilice funciones miembro en ColoredBox
cb.SetColor(5)
// no hereda
cb.SetWidth(3);
// heredadas
cb.SetHeigth(50);
// heredadas
Observe como las funciones heredadas se utilizan exactamente como no
heredadas. La clase ColoredBox ni siquiera tuvo que mencionar el hecho de que
las funciones Box::SetWidth( ) Box::SetHeigth() fueron heredadas. Esta
uniformidad de expresión es una carácteristica formidable de C++.
La carácteristica de polimorfismo de la POO permite que las instancias de diferentes
clases reaccionen de una forma particular al llamado de una función. Por ejemplo, en
una jerarquia de formas graficas (punto, linea, cuadro,rectangulo, etc.), cada forma
tiene una función >Draw responsable de contestar adecuadamente a peticiones del
trazo de esa forma.
El polimorfismo permite que las instancias de diferentes clases respondan a la misma
función en forma adecuada para cada clase.
El ejemplo anterior de los clientes se podría forzar que toda subclase de clente tuviera
una operación (servico o método) de calculo_descuento, definiendo una operación
diferida o (virtual) en la clase abstacta cliente. Es decir, que cliente pasa a ser una
especie de plantilla de todos los clientes donde hay algunas cosas definidas (nombre,
DNI) y otras pendientes a definir en cada subclase (calculo_descuento). En caso de
que esto suceda, podriamos garantizar que todo cliente tendría una operación de
calcular descuentos asociados sea el tipo de cliente que sea. Si nos encontramos en esta
situación estaremos en disposición de usar lo que se llama polimorfismo, que significa
que muchos programas se hacen extensibles a nuevos tipos sin necesidad de
recompilarlos.
El origen del termino polimorfismo es simple: ya que describe la capacidad de codigo
de C++ de comportarse de diferentes maneras dependiendo de situaciones que se
presenten al momento de la ejecución. Este comportamiento a menudo escapa del
control directo del programador. El polimorfismo no es tanto una carácteristica de
objetos como lo es de funciones miembro de una clase. Se implanta a traves de la
arquitectura de clases; sin embargo, solo las funciones miembro de la clase puede ser
polimorficas, y no la clase completa
Considere una serie de clases que se emplean para implantar una base de datos que
lleve el registro de obras maestras de arte. Las clases están organizadas en una
jerarquía, con la intensión de permitir al programador tener acceso a cualquier
objeto de la base de datos sin que sepa de que tipo de objeto se trata
Cualquier carácteristica común en la base de datos pertenece al nodo más alto posible
del árbol. Todos y cada uno de los nodos de la base de datos tiene un autor y una
fecha. Otra información puede variar entre clases, como el método que se emplea para
desplegar información acerca de un objeto. Esta función de presentación es un
candidato para el polimorfismo y se implanta con el mecanismo de las funciones
virtuales.
Ejemplo: Invocación deliverada de una función virtual pura.
class a {
public:
virtual void printOn( ) =0;
};
//una función virtual
void main( )
{
A*b;
a-> printOn( );
}
//aqui hay graves problemas..
La llamada a la función main( )es declarada por el sistema durante la ejecución,
produciendo el mensaje de error.
Anormal program termination
(Terminación anormal del programa)
El mensaje es más bien genérico, pero otros compiladores de C++ son aun menos
elegantes en el manejo de este tipo de errores durante la ejecución y puede hechar a
perder todo.
EVALUACION
unidad ii
Una abstracción de datos de cualquier lenguaje de programación, es la capacidad de
crear tipos de datos definidos por el usuario.
La abstacción se define como la <<extracción de propiedades esenciales
de un concepto>>. Con la abstracción de datos, las estructuras de datos e ítems se
pueden utilizar sin preocuparse sobre los detalles exactos de la implementación.
La abstacción de datos permite no preocuparse de los detalles no esenciales. La
abstacción de datos existe en casi todos los lenguajes de programación. Las
estructuras de datos y tipos de datos son un ejemplo de abstacción. Los
procedimientos y las funciones son otro ejemplo. Sin embargo, solo recientemente han
emergido lenguajes que soportan sus propios tipos abstactos de datos TAD (Tipos
de datos abstactos), como Pascal, Ada, Modula-2 y naturalmente C++.
En C++ TAD (Tipos de datos abstactos), es posible incluir en el, ademas de
los datos, funciones que manipulan a esos datos. TADs se pueden implementar C++,
con los tipos de estructura (struct) y clase (class).
En C++ un tipo de dato definido por el usuario se declara con una estructura:
struct fecha {
int dia;
int mes;
int anyo;
};
Esta estructura tiene tres miembros día, mes y anyo, a veces esta definición se sitúa an
un archivo de cabecera y se incluye al principio de todos los programas que utiliza la
estructura. Se desea declarar una variable que tenga el formato de la estructura, y se
hace de la siguiente manera:
fecha hoy;
//declara una variable estructurada
Una clase es un tipo especial de datos, y esta orientado a creación de objetos y que
consta de unos miembros que pueden ser todas o funciones privadas o publicas.
Una clase es un tipo de dato que contiene uno o más elementos llamados dato
miembro, y cero, una o más funciones que manipulan esos datos (llamados función
miembro). Una clase se puede definir con una estructura (struct), una unión
(unión) o una clase (class).
La sintaxis de una clase es:
class nombre_clase
{
miembro_1;
//lista de miembros
miembro_2
miembro_3
funcion_miembro_1( );
// funciones miembro conocidas
funcion_miembro_2 ( );
// funciones como métodos
Para usar una clase, primero tiene que declarala, como se hace en el caso de las
estructuras. La declaración de una clase puede aparecer sólo una vez en un programa,
tal y como las estructuras. Esta es una declaración de una clase simple:
class counter {
long count;
public:
void SetCount(long);
long GetValue( );
};
La palabra clave class introduce una declaración de clase. Después aparece el
nombre de la clase. El cuerpo de una clase debe de encerrarse en corchetes, seguido de
un punto y coma. Las clases contienen no sólo declaraciones de funciones, sino
también definiciónes de funciones completas. Las funciones contenidas en clases
pueden ser tan largas y complejas como uno desee que lo sean. Se considera que las
variables declaradas dentro de una clase pertenecen a esa clase. En ciertas
circunstancias, las variables pueden compartirse entre las diferentes instancias de una
clase. Existe garantía de que los identificadores de variables y funciones contenidos en
una clase no chocan con los identificadores que se usan en otras. Básicamente una
clase es un mundo con identificadores propios únicos.
CUERPO DE UNA CLASE
La variable count se define dentro del cuerpo de la clase. Por lo tanto, count
recibe el nombre de variable miembro de la clase. Cualquier variable definida en una
clase tiene campo de acción. El campo de acción de la clase no esta disponible es decir
que este punto de declaración de una variable final de la declaración de la clase. Es un
error intentar el accceso a una variable miembro después de la declaración de la
clase, como se puede apreciar en el código siguiente:
class counter {
long count;
public:
count = 3;
//error: count no esta definida aqui.
USO DE UNA CLASE
Para usar una clase se debe definir un objeto con ella. Las variables de una clase se
definen tan solo como variables de tipo estructura o variables escalares. Para definir
la variable de la clase people de tipo counter, se utiliza esta notación:
Counter people
Las variables instanciadas a partir de clases son los objetos. En general, es imposible
usar una clase directamente. Las contadas excepciones a este regla se ilustran más
adelante. Para el objeto people, esta es la forma en que lo podría utilizar un
programa:
Void main ( )
{
counter people;
//inicialice el objeto
people.SetValue(0);
// verifique que se borre
long value = people.GetValue( );
}
EVALUACION