UNIVERSIDAD NACIONAL DEL ALTIPLANO
ESCUELA PROFESIONAL:
INGENIERÍA DE SISTEMAS
TRABAJO DE INVESTIGACIÓN
INGENIERÍA DE SISTEMAS
DOCENTE:
ALDO HERNAN ZANABRIA GALVEZ
ALUMNA:
JHENERY ANYELA CARBAJAL PARI
PROGRAMACION ORIENTADA A OBJETOS
Características principales
Una de las ideas fundamentales del paradigma de programación orientada a objetos es el concepto de objeto como una entidad que engloba datos y funciones.
El enfoque de la POO permite modelar un dominio (problema a programar, un simulador de deportes, por ejemplo) de una forma muy cercana a la realidad. Los objetos del programa simulan los objetos (sustantivos) del dominio (por ejemplo, bicicleta, marchas, carretera, etc.). Y los métodos de los objetos permiten modelar perfectamente las acciones (verbos, por ejemplo cambiar de marcha, pedalear, etc.) que pueden realizar. Entre las características de la POO podemos indicar los siguientes conceptos:
• Objetos (dinámicos/tiempo de ejecución) y clases (estáticas/tiempo de compilación).
• Los objetos agrupan datos (variables de instancia) y funciones (métodos), realizando de esa forma una ocultación de la información.
• Los métodos de los objetos se invocan mediante mensajes.
• Dispatch dinámico: cuando una operación es invocada sobre un objeto, el propio objeto determina qué código se ejecuta. Dos objetos con la misma interfaz pueden tener implementaciones distintas.
• Herencia: las clases se pueden definir utilizando otras clases como plantillas y modificando sus métodos y/o variables de instancia.
Historia de la Programación Orientada a Objetos
Podemos considerar como inicio del paradigma de Programación Orientada a Objetos (Object Oriented Programming) el lenguaje de programación Simula desarrollado por Kristen Nygaard y Ole-Johan Dahl en la mitad de los años 60 en el Centro de Computación Noruego (The Norwegian Computing Center). Simula se definió como un lenguaje de programación orientado a la simulación de procesos, con el que se podían definir distintos tipos de actividades. En este lenguaje aparecen por primera vez los conceptos de clases y objetos.POLIMORFISMO
Definición
Capacidad de una entidad de referenciar distintos elementos en distintos instantes de tiempo.
El polimorfismo nos permite programar de manera general en lugar de programar de manera específica.
Hay cuatro técnicas, cada una de las cuales permite una forma distinta de reutilización de software, que facilita a su vez el desarrollo rápido, la confianza y la facilidad de uso y mantenimiento.
- Sobrecarga
- Sobreescritura
- Variables polimórficas
- Genericidad
Tipos de polimorfismo
- Sobrecarga (Overloading, Polimorfismo ad-hoc): un solo nombre de método y muchas implementaciones distintas. Las funciones sobrecargadas normalmente se distinguen en tiempo de compilación por tener distintos parámetros de entrada y/o salida.
Factura::imprimir() Factura::imprimir(int numCopias)
ListaCompra::imprimir()
- Sobreescritura (Overriding, Polimorfismo de inclusión): Tipo especial de sobrecarga que ocurre dentro de relaciones de herencia. En este caso la signatura es la misma (refinamiento o reemplazo del método del padre) pero los métodos se encuentran en dos clases distintas relacionadas mediante herencia. Cuenta::abonarInteres() CuentaJoven::abonarInteres()
- Variables polimórficas (Polimorfismo de asignación): variable que se declara como de un tipo pero que referencia en realidad un valor de un tipo distinto. Cuando una variable polimórfica se utiliza como argumento, la función resultante se dice que exhibe un polimorfismo puro. Cuenta *pc=new CuentaJoven();
- Genericidad (plantillas o templates): forma de crear herramientas de propósito general (clases, métodos) y especializarlas para situaciones específicas.
Lista <cliente>
Lista <articulo>
Lista <alumno>
Lista <habitación>
Implementación interna en C++
Las funciones virtuales son algo menos eficientes que las funciones normales.- Cada clase con funciones virtuales dispone de un vector de punteros llamado v_table. Cada puntero corresponde a una función virtual, y apunta a su implementación más conveniente (la de la propia clase o, en caso de no existir, la del ancestro más cercano que la tenga definida)
- Cada objeto de la clase tiene un puntero oculto a esa v_table.
Ejemplos
- Todos los vehículos "corren" (por decirlo así) pero no todos "corren" igual. Así, por ejemplo, una carcochita viaja a 20 km/h mientras un lamborghini lo hace a más de 100 km/h (por decir algo simple): clase vehiculo {
metodo run()
}
clase carcochita => es un vehículo {
redefine metodo run() { corre a 20km/h }
}
clase lamborghini => es un vehículo {
redefine metodo run() { corre a 150km/h }
}
Y el polimorfismo:
vehiculo carrito1, carrito2 /* ambos son vehículos */
carrito1 = new lamborghini
carrito2 = new carcochita
competir: carrito1.run() vs. carrito2.run() /* ambos llaman a run */ - Cree un programa para que tenga un método llamado imprimirInfo
que reciba un objeto que pueda ser de cualquiera de las siguientes clases
(Fruta, Manzana y Naranja) , e
imprima el nombre y las características del objeto.Public class InfoFrutas{Public void imprimirInfo(Fruta fr){System.out.print(“La fruta se llama: “);fr.escribeNombre();fr.escribeCaracteristicas();}Public static void main(String[] args){//se crean unos cuantos objetos de la clase Fruta, Manzana y Naranja.//Ademas se inicializan sus valores.Fruta frutal = new Fruta(“Mango”);Naranja fruta5 = new Naranja();fruta5.cambiaOrigen(“Valencia”);Naranja fruta6 = new Naranja();fruta6.cambiaOrigen(“Marruecos”);//Se imprime su función//Se crea un objeto de la clase que imprime Informacion, en este caso es esta propia clase donde está el main.InfoFrutas imp = new Infofrutas();imp.impimirInfo(fruta6);imp.impimirInfo(fruta1);imp.impimirInfo(fruta3);imp.impimirInfo(fruta4);imp.impimirInfo(fruta5);imp.impimirInfo(fruta2);}}
- Todos los animales comen algo, pero algunos comen carne, otros hierbas, otros se comen entre si, etc.
class animal {
metodo comer()
}
class carnivoro => es un animal {
redefine metodo comer() { come carne }
}
class herbivoro => es un animal {
redefine metodo comer() { come hierba }
}
class omnivoro => es un animal {
redefine metodo comer() { como de todo }
}
animal leon, tortuga
leon = new carnivoro
tortuga = new herbivoro
leon.comer
toruga.comer
- Todas las personas tienen un color de piel, pero algunos son negritos, otros amarillos, otros blancos, otros rojos, otros verdes, otros azules, otros color #548762, etc.
class personita {
metodo colordepiel()
}
class negrito: es una personita {
redefine metodo colordepiel() { es negrito }
}
class indito: es una personita {
redefine metodo colordepiel() { es un indito }
}
personita manuel, juan, pepita, lulu
lulu = new negrito
pepita = new indito
...
manuel.colordepiel, etcétera.
ENCAPSULAMIENTO
El acceso a las responsabilidades de los objetos tiene múltiples aristas. Por una parte el acceso a los métodos
en principio siempre es de la misma forma:
<objeto>.<método>([<valores de los parámetros>])
Situación de análisis
Suponga la existencia de una clase Consola con un método Imprimir que permite mostrar por pantalla
una cadena de caracteres como se muestra a continuación:
Consola
...
Consola
...
Consola
...
Imprimir(cadena mensaje)
...
Existen tres niveles de acceso para el encapsulamiento, los cuales son:
Público (Public): Todos pueden acceder a los datos o métodos de una clase que se definen con este nivel, este es el nivel más bajo, esto es lo que tu quieres que la parte externa vea.
Protegido (Protected): Podemos decir que estás no son de acceso público, solamente son accesibles dentro de su clase y por subclases.
Privado (Private): En este nivel se puede declarar miembros accesibles sólo para la propia clase.
EJEMPLOS
- De un televisor, el usuario conoce su apariencia y parte de su funcionamiento. Sólo le importa que funcionen el selector de canales, el video y el audio; no le interesa saber cómo funciona cada una de las partes internas del aparato, ese detalle sólo le interesan al fabricante y al técnico de servicio.
- De un animal no sólo es necesario conocer su apariencia; también se requiere conocer qué sabe hacer y cómo reacciona ante determinadas situaciones.
- Se necesita que cualquiera pueda acceder a el color de un vehículo, entonces:
Opción a: Declaro entonces COLOR como Privado
Opción b: Declaro entonces COLOR como Protegido
Opción c: Declaro entonces COLOR Como Público ¡Claro!, Sí escogiste la Opción C, te has Ganado un pase al siguiente ejemplo…, de lo contrario vuelve a darle un repaso a los niveles de acceso. Se necesita qué color se pueda acceder a través no sólo de vehículo, sí no ahora también de Buses, y como todos sabemos un bus es un tipo de vehículo, entonces también deberá tener acceso a color.
Opción a: Declaro entonces COLOR como Privado
Opción b: Declaro entonces COLOR como Protegido
Opción c: Declaro entonces COLOR Como Público Correcta Opción b- Se necesita que color se pueda acceder solamente para vehículo.
Opción a: Declaro entonces COLOR como Privado
Opción b: Declaro entonces COLOR como Protegido
Opción c: Declaro entonces COLOR Como Público Correcta Opción a -
-
OBJETO
Un objeto es una encapsulación de un estado (valores de los datos)
y comportamiento (operaciones).
Un objeto es un elemento individual e identificable, ya sea real o abstracto, el cual
contiene una serie de datos que lo definen y las descripciones de cómo pueden ser
manipulados dichos datos (Armstrong, 1996). Un objeto también es llamado instancia de
una clase.
DECLARACIÓN DE UN OBJETO
Uno o varios objetos pueden ser declarados como sigue:
Nombre_de_clase: objeto1, objeto2, ..., objeton
Donde:
• Nombre_de_clase es el identificador de la clase a la cual pertenecen los objetos
declarados.
• objeto¡ (1 <= i <= n) es un identificador válido para un objeto perteneciente a la clase.
CREACIÓN DE UN OBJETO
La creación de un objeto consiste en asignarle al mismo un nuevo espacio en
memoria para ser almacenado. En NASPOO esta creación se realiza de forma implícita al
declarar un objeto, mediante un método predefinido llamado "crear", el cual no tiene
parámetros y retorna una referencia al objeto creado. Tiene la siguiente sintaxis:
func crear():NOmbre_de_clase
Este método debe ser usado explícitamente para asignar memoria a un objeto de tipo
Apuntador para asignar memoria al objeto al cual apunta.
INICIALIZACIÓN DE UN OBJETO
La inicialización de un objeto consiste en asignar valores iniciales válidos a los
atributos de un objeto después de haber sido creado. Esta acción es realizada por el
constructor de la clase a la cual pertenece el objeto. Para inicializar un objeto de una
clase es posible utilizar el constructor de la clase ("construir") o el constructor copia de la
clase ("copiar"). La sintaxis es la siguiente:
Cuando se invoca al constructor de la clase:
objeto.construir( [A1; A2; ... ; An] )
Cuando se invoca al constructor copia de la clase:
objeto2.copiar(objeto)
Donde:
• objeto es el identificador de un objeto.
• construir es el identificador por defecto del constructor de la clase a la cual
pertenece el objeto.
• Cada A¡ (1 <= i <=n) es un grupo de parámetros actuales, a1, a2, ... , am, donde aj (1 <= j <= m) es el identificador del parámetro actual correspondiente al j-ésimo parámetro formal
del i-ésimo grupo.
• objeto2 es el identificador de un objeto de la misma clase que "objeto".
ATRIBUTOS
Los atributos constituyen la estructura interna de los objetos de una clase (Ceballos,
2003); son un conjunto de variables que describen el estado de un objeto (Joyanes,
1996).
DECLARACIÓN DE UN ATRIBUTO
Para declarar uno o varios atributos de una clase, se coloca el nombre de la clase
seguido de dos puntos (:) y la lista de identificadores pertenecientes a dicha clase
separados por comas, de la siguiente forma:
Nombre_de_clase: atribut01, atribut02 , ... , atributon
Donde:
• Nombre_de_clase es el nombre de la clase a la cual pertenecen los atributos.
• Cada atributo¡ (1<= i <=n) es un atributo de la clase Nombre_de_clase.
HERENCIA
La herencia permite que las propiedades de la superclase se propaguen a las
subclases en una jerarquía de clases (Poo, Kiong y Swarnalatha, 2008), por lo tanto, es
un mecanismo que permite a una clase de objetos compartir la representación y los
métodos de otra clase de objetos (LaLonde y Pugh, 1990). Es una forma de reutilización
de software, en la cual para crear una nueva clase se absorben los datos y
comportamientos de una clase existente y se mejoran con capacidades nuevas (Deitel y
Deitel, 2009). Existen dos tipos de herencia: simple y múltiple.
Herencia Simple
La herencia simple se da cuando una clase se deriva de una sola clase base (Deitel y
Deitel, 2009). Para representar la herencia en NASPOO se utiliza la palabra reservada
hereda_de luego del identificador de la clase derivada, seguido del identificador de la
clase base de la siguiente forma:
clase Subclase
hereda_de Superclase
II Declaración de los atributos y métodos de la clase
fclase
Donde:
• Subclase es el identificador de la clase derivada.
• Superclase es el identificador de la clase base.
Herencia Múltiple
La herencia múltiple se da cuando una clase derivada hereda de varias clases base
(posiblemente no relacionadas) (Deitel y Deitel, 2009). Este tipo de herencia no es
soportado por todos los lenguajes de programación orientados a objetos (por ejemplo,
Java), sin embargo teóricamente es importante conocer este mecanismo, su uso, ventajas
y desventajas.
clase Subclase
hereda_de Superclase1, Superclase2, ... , Superclasen
II Declaración de los atributos y métodos de la clase
fclase
Donde:
• Subclase es el identificador de la clase derivada.•
Superclase¡ (1 <= i <= n), es el identificador de una de las clases base.EJEMPLOS
CLASE
Una clase es una descripción de la organización y las acciones compartidas por uno o
más objetos similares (Armstrong, 1996). De acuerdo a esta definición, una clase está
estructurada por la abstracción de las características y funcionalidades relevantes
compartidas por un conjunto de objetos que representan parte de un sistema. Las
características comunes a todos los objetos se conocen como atributos de la clase, y las
funcionalidades se conocen como los métodos de la clase.
La estructura general de una clase es la siguiente:
clase Nombre de clase
atributos:
// Declaración de los atributos de la clase métodos:
// Declaración de los métodos de la clase
fFclase
Donde Nombre de clase debe ser un identificador válido para la clase. Un
identificador válido debe contar con las siguientes características:
• Debe ser una única palabra, es decir, no debe contener espacios.
• Debe estar compuesto únicamente por letras (mayúsculas o minúsculas), números,
o los símbolos guión ('-') o piso ('_').
• No puede comenzar por un número o un símbolo.
• No puede coincidir con ninguna palabra reservada del lenguaje pseudoformal.
Nótese que además de las características previamente mencionadas, por convención,
la primera letra del identificador de una clase se debe colocar en mayúsculas. En
NASPOO todos los elementos son objetos derivados de una clase y todas las clases se
derivan de una única clase base llamada Objeto.
CLASES PREDEFINIDAS
Se asume la existencia de una serie de clases predefinidas que corresponden a los tipos de datos definidos previamente en NASPI (Martínez y Rosquete, 2009). Estas clases predefinidas son:
• Primitivas o Elementales: Ordinal, Entero, Real, Lógico, Símbolo.
• Compuestas: Cadena, Apuntador, Arreglo, Enumerado, Intervalo, Archivo_s (archivo de acceso secuencial), Archivo_d (Archivo de acceso directo).
ESTRUCTURA DE UNA CLASE
Como se había mencionado anteriormente, una clase está formada por atributos y métodos.
EJEMPLOS
METODO
Los objetos se comunican unos con otros mediante el envío de mensajes, los cuales
son llamadas a métodos, hechas por un objeto emisor hacia un objeto receptor. Un objeto
responde a un mensaje mediante la ejecución de un método (Poo, Kiong y Swarnalatha,
2008).
Según lo expresado anteriormente, un método es una colección de sentencias que
ejecutan una tarea específica, se implementa en una clase y determina cómo debe actuar
un objeto cuando recibe un mensaje vinculado con ese método (Ceballos, 2003).
DEFINICIÓN DE UN MÉTODO
Para definir un método, se aplica la misma sintaxis definida para NASPI (Martínez y
Rosquete, 2009). La definición de una función tiene la siguiente sintaxis:
[estático | const | virtual] func metodo ([F1; ... ; Fn]) : Nombre_de_clase
[// Declaraciones locales]
inicio
// Instrucciones
retornar(expr)
ffunc
La definición de un procedimiento tiene la siguiente sintaxis:
[estático | const | virtual] proc metodo ([F1; ... ; Fn])
[11 Declaraciones locales]
inicio
//Instrucciones
fproc
Donde:
• método es el identificador de un método (función o procedimiento).
• Cada F¡ (1 :::; i :::; n) es un grupo de parámetros formales definidos de la siguiente
forma: {val I ref} Nombre_de_Clase¡: P1, P2, ... , Pm, donde:
• val o ref indican si el paso de parámetros se realiza por valor o por referencia,
respectivamente.
• Nombre_de_clase¡ es la clase de los parámetros formales que forman el i-ésimo
grupo.
• Pi (1 :::; j :::; m) es el identificador del j-ésimo parámetro formal del
i-ésimo grupo.
Además, en el caso de una función:
• Nombre_de_clase es la clase del objeto que retorna la función.
• expr es el valor de retorno de la función. El valor resultante de expr debe pertenecer
a la clase Nombre de clase.
BIBLIOGRAFIA
- ferestrepoca.github.io
- codigofuentenet.wordpress.com
- Problemas resueltos de programación en lenguaje Java Escrito por JESUS CARRETERO PEREZ,FELÍX GARCIA CARBALLEIRA,JOSE MANUEL PEREZ LOBATO,JOSE MARIA PEREZ MENOR
- https://www.researchgate.net/publication/237008947_Programacion_Orientada_a_Objetos_con_C_Parte_I_Introduccion_a_la_Programacion [accessed Apr 10, 2017].
- Programación Orientada a Objetos con C#, Parte I Introducción a la Programación https://es.wikibooks.org/wiki/Fundamentos_de_programaci%C3%B3n/La_Abstracci%C3%B3n_y_el_Encapsulamiento
- https://rua.ua.es/dspace/bitstream/10045/15993/1/POO-1-Intro-10-11.pdf
- Programación Orientada a Objetos con C#, Parte I Introducción a la Programación
- http://www.redalyc.org/pdf/784/78419688005.pdf