CLASE (concepto) → instanciación → OBJETO (tangible)
Ejemplo, la Clase es el molde de un soldadito de plomo, y el muñeco sería el objeto.
- Abstracción.
- Herencia (paso de características y descripción de uno a otro, tendremos clase principal y derivada). Esas ideas abstractas que describimos mantienen una relación entre ellas. Esas relaciones lo que nos permiten es generar, al igual que la realidad, clases que basan su comportamiento, forma, etc. en otras clases que están definidas previamente. Nos va a permitir crear objetos altamente complejos sin necesidad de tener que crearlos desde cero. Esto es fundamental, hay lenguajes que les falla la herencia, así que no podemos decir que sea orientado a objetos (como visual basic al principio). Funcionará de forma muy parecida a como funciona la genética. Una clase que hereda será mucho más concreta que otra, según bajemos en el árbol de herencia las clases serán más concretas. ¿qué ventajas ofrece la herencia? aparte de definir rápido las características... la variabilidad muy alta de nuestro código, porque de una sola clase que creemos de forma adecuada con el suficiente nivel de abstracción, podremos obtener una multitud de clases que nos servirán para muy distintos cometidos con cambios minúsculos. Por ejemplo, si tenemos una clase A y derivo una clase B, esto es una herencia directa de primer orden, A sería de primer orden, clase madre, superclase... B sería derivada, hija. B puede a su vez tener una clase derivada C, porque C tendrá una herencia indirecta de A, la recibe de lo que ha heredado B de A, también lo que hereda de A recibe todo lo que tiene B. C será herencia directa de B e indirecta de A, C será derivada de segundo orden de A. Estas líneas de unión forman la línea de herencia y nos permiten ir viendo lo que hay. Esto visto es una herencia simple (sólo tengo un padre), sin embargo, existe la posibilidad de recibir una herencia múltiple, normalmente de dos. La herencia múltiple es maravillosa, c++ nos dan herencia múltiple, permite heredar directamente las características de dos clases que pueden ser entre sí muy distintas. Ej, clase hombre-lobo que deriva de la clase hombre y lobo, a hombre-lobo le añadiríamos la capacidad de transformación, la luna llena, etc. Nosotros en los lenguajes con los que trabajaremos no lo veremos porque sólo trabajaremos con la herencia simple, veremos trucos para poder hacer cosas similares.
¿Heredamos
todo? NO, solo lo que el creador haya decidido que se herede. Las
variables globales serán prohibidas, las variables las llamaremos
privadas, que son aquellas que se conocen exclusivamente dentro de la
clase, ni siquiera las clases que se hereden tendrán conocimiento de
ellas. Esta característica no se la enseño al exterior, pero sin
embargo, mis descendientes sí. No transmitimos todo, solo lo que
queramos y solo daremos acceso a lo que nos permita dar acceso.
- Encapsulación/ocultación (encapsulamiento/ocultación): ligado a ocultación. Una clase debe ser autónoma, autosuficiente, debe funcionar como una “caja negra”, algo que su interior permanece opaco, oculto e inaccesible. Son principios bien diferenciados, trabajaremos con ellos por igual pero son distintos.
Lo
que me dice es que todo lo que una clase necesite debe ir introducido
dentro de la clase, empaquetada, aislada del exterior, de tal manera que
no voy a dejar que cualquiera acceda a mi paquetito, dejaremos unos
canales para ello (extrae información...)
¿para
que encapsulamos las cosas? Para poder incrementar la cohesión, la
estabilidad, ya que al tenerlo todo en un mismo sitio, empaquetado y
ordenado, evitamos que se nos queden trozos de código descolgadas de lo
que sería nuestra clase, ¿en que se traduce? que trabajaremos con la
modularidad dentro de los programas orientados a objetos, las clases
tendrán sus propios fichero y espacios de trabajo, delimitadas de dónde
hasta dónde llegarán.(ver wikipedia, posiblemente lo define de manera similar a esta)
La ocultación se basa en la teoría de la caja negra, lo que no sabes,
no te hace daño, todo lo que es el interior de la clase, todo lo que no
esta destinado a establecer una comunicación con el exterior, NADIE
tiene porque verlo, ni saber ni siquiera de su existencia, “ves lo que
hago, lo que pido y doy, pero no vas a saber como lo hago, y no vas a
saber qué lo hace”. Ejemplo de porque cuando nacemos tenemos los órganos
ocultos como seres humanos.
- Polimorfismo: que al ser de una clase puede ser al mismo tiempo varias cosas. Ej, el profe es un hombre, y puede meterse en la piel de un ser humano, puede meterse en la piel de un mamífero, ¿puedo ser humano y mamífero? sí. Luego, podemos ser cualquier cosa de la línea de herencia.
Podemos
adoptar múltiples formas. Un objeto puede adoptar un aspecto, una
interfaz de aquellas clases que están en su línea ascendente. Ej,
asiento → silla, la silla tiene sus características, el asiento no (por
eso esta en orden superior), pero la silla se puede comportar como un
asiento, luego en un momento determinado la silla puede funcionar como
un asiento, obviando el respaldo, esto quiere decir que adopta la piel
del asiento, cuando la silla funciona como asiento, no podemos hablar
del respaldo (pero no lo pierde, y no lo podemos utilizar). Imagina que
asiento y silla, son hombre → astronauta, y nos vamos a marte. el
astronauta es un hombre, pero sabe de determinadas características,
lleva un traje que le da estabilidad térmica y además le proporciona un
analizador químico de la atmósfera, respirar en ambientes que un ser
humano no puede hacerlo, y puede visualizar datos que un ser humano no
puede ver, cuando un astronauta se comporta como un ser humano no tiene
el traje. si lo metemos en la piel de hombre, deja de tener las
características del astronauta. En eso consiste el polimorfismo.
Imaginad que tenemos botones, 3, el azul, negro, y rojo, cada uno con
características distintas, ¿como puedo saber que me pulsan un botón?
Como los tres son botones, se comportan como botones, sólo con las
características de botón.
Aparte de cumplir con estos principios, todo lo que haya dentro de ese
lenguaje han de ser clases. Tenemos que crear objetos a partir de las
clases. Todo estará definido como CLASES. Cesar cumple como todo esto y
cumple con las clases. Es un lenguaje bastante moderno y coge, por una
parte lo mejor de c++, c y lo mejor de java. Java, por ejemplo se
cumplen los 4 principios, pero no todos los elementos son clases,
tenemos acceso a las primitivas, datos de variables que no son clases,
así que ya no es orientado a objetos 100%. C++, es la extensión
orientada a objetos de C. Otro lenguaje que es muy de moda es O-C
|objective c| desarrollo de iphone, ha pasado a ser conocido por la
cantidad de desarrollo de aplicaciones que hay para él, es una mezcla de
java y c++. PHP tiene orientación a objetos a partir de la versión 6,
javascript tiene tb cierta orientación a objetos.
¿qué elementos definen una CLASE?
Si
definimos una variable y exponemos al exterior esa variable estamos
dando acceso al exterior y podrá meter lo que él quiera. Tendremos estado y estado interno. Estado son los elementos que ponemos al exterior, aquellos elementos visible desde fuera, el estado interno son
aquellos elementos a los que tenemos acceso, son única y exclusivamente
nuestros, nadie podrá acceder a ellos, ese estado interno será “nuestro
depósito de aire”, lo ocultaremos y nadie tendrá acceso nunca. Ej, el
corazón es un estado interno, los pulmones tendrían un estado externo
que permite la entrada y salida de aire.
Los estados estarán compuestos por características,
si estoy creando una clase alumno, sus características serán nombre,
nota fin de curso, nora de practicas... si hago una ficha policial,
serán color de ojos, estatura, color del pelo...
De
qué dependen las características, de qué queramos hacer con ella, no
será igual para recurso humanos que para una ficha policial, si podremos
hacer una común para ambas, la longitud es una característica que será
de lectura y escritura, porque podremos modificar esa característica, la
estatura no se puede modificar, solo veremos el dato, desde fuera no,
al igual que el color de ojos, longitud de uñas, no podremos incrementar
la longitud, pero sí recortarla. Dentro de los estados tendremos los métodos.
Los métodos son las accione,s las funcionalidades que pueden realizar
esa clase, ej, un ser humano, puede correr? sí, esto sería un método.
Con este método le damos la posibilidad de correr, puede volar?, no, el
ser humano no lo tendría, pero un murciélago sí. Tendríamos adjetivos y
verbos, el adjetivo, las características, los verbos serían las acciones
los métodos. Con los métodos hay que tener cuidado, porque no son
propios de la clase. Ej, el alumno ¿tendría el método aprobar? No,
alguien le aprueba.
¿Cómo influye una clase externa sobre nosotros? Con mensajes,
comunicaciones que existen entre las clases y el sistema y viceversa.
Las clases serán origen y destino de mensajes, pueden empezar una
comunicación o el destinatario de esa comunicación. Estos mensajes los
definimos con las relaciones que tienen entre las clases, serán unos de
los gráficos UML que nos harán falta para definir estos conceptos que
estamos viendo.
¿Cómo se recibe un mensaje? porque
nos han alterado una propiedad o a través de algo que denominamos
“evento”. Cuando definimos un evento de una clase, a esa funcionalidad
que tenemos para capturar esos mensajes son eventos, programaremos
eventos, es el suceso en sí mismo, no, es una porción de código que
genera un suceso o de capturar un suceso. Puede ser que capturemos un
evento o estemos lanzando un evento.
Todos
los programas comenzarán con una CLASE que se encargará que toda la
aplicación esté funcionando. En el caso de windows se cerrará la
aplicación pulsando el aspa de la esquina. Simplemente para decirle que
tiene que hacer aquí dentro (la afamada bomba de mensajes) le diremos
con qué interactuamos (objetos). Ya tendremos un objeto instanciado que
está interactuando con el sistema el que mantendrá la aplicación viva.
Esta estructura de mensajes nos la proporciona un Framework, así nuestra
estructura se podrá efectuar en cualquier sistema, por ejemplo en java,
se puede ejecutar en cualquier plataforma (móviles, televisión, una
lavadora...), porque su entorno de trabajo le proporciona la
funcionalidad. .NET proporciona esa funcionalidad, pero no se han
molestado que ese framework no se ejecute en otros sistemas operativos
(Mac, iphone...) el proyecto MONO esta cerrado, pero permite hacer
aplicaciones para windows mobile, android, iphone.
Ahora
a la hora de compilar, necesitaremos algo que nos lo permita. En el
caso de java se produce una precompilación, para que la máquina virtual
de java lo ejecute, la máquina virtual es un intérprete. Si queremos
ejecutarlo en linux necesitaremos una máquina virtual para linux y
ejecutar java. La máquina virtual es un intérprete.
Empezaremos definiendo clases. AMIGO/A, qué características tiene?
sinceridad
colaborador
nombre
edad
género
peso
altura
color ojos
color pelo
complexión
Primero
definiremos el contexto, ¿qué necesidad de información o de datos voy a
tener? Según los tipos de agenda tendremos distintas necesidades
(chorvagenda, trabajo, normal y corriente). Tendremos en la agenda
normal: Nombre (L/E), apellidos (L/E), género (L/E), fecha de nacimiento
(L/E), edad (es un dato indirecto) (L). Acciones de “amigo”, pagar
cerveza, consolar (amigo) con quien establece esta acción, ayudar A (ser
vivo) como ser vivo no esta definido habrá que hacerlo y amigo vendrá
heredado de ésta,
Hacemos clase ALUMNO, características para una asignatura o curso completo:
nombre,
apellidos, edad*, fecha_nacimiento, nivel_academico, calificacion,
genero, domicilio. Tendremos también un identificador de objeto que será
transparente a nosotros. Normalmente cogeremos algo que nos permita
definir ese conjunto de datos en concreto. ¿Qué acciones haría ALUMNO?
grabar, [suspender no, ya que el profesor es el que suspende], borrar, …
Hacer lo mismo para el profesor:
- características: nombre, apellidos, fecha_nacimiento, edad*, genero, domicilio, num_dni, experiencia_docente, nivel_academico, vehiculo_propio, num_seg_social, salario.
- acciones: grabar, borrar (alumno), enseñar (alumno), reprender (alumno), calificar (alumno).
Que elementos hay comunes entre profesor y alumno:
nombre, apellidos, edad*, fecha_nacimiento, nivel_academico, genero, domicilio,
si todo esto es lo mismo, exactamente lo mismo... ¿podríamos generar una superclase que definiera esto? Sí. Generamos clase PERSONA con nombre, apellidos, edad*, fecha_nacimiento, nivel_academico, genero, domicilio. ALUMNO y PROFESOR heredan de PERSONA. Las características de Alumno y Profesor contienen las de Persona.
Intentar
representar un colegio, alumnos, bedeles, administradores, profesores,
jefes de estudios, director, con 8 perfiles basta. Una vez hechos esos
perfiles con sus acciones. Haremos 3 de elementos del colegio: aula...
con lo que haya en un colegio.
- Alumno: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, num_matricula, enfermedades, nivel, asignaturas, calificacion, asistencia ⇒ grabar, borrar, estudiar,
- Profesor: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, nivel_academico, salario, asistencia_trabajo, experiencia_docente ⇒ enseñar (alumno), evaluar (alumno), calificar (alumno), compartir (), educar (alumno)
- Jefe Seminario: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, nivel_academico, salario, personal_a_cargo, asistencia_trabajo, ⇒ enseñar (alumno), evaluar (alumno), educar (alumno), calificar (alumno), compartir (), guiar (profesor)
- Jefe de estudios: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, nivel_academico, salario, personal_a_cargo, asistencia_trabajo,⇒ enseñar (alumno), evaluar (alumno), educar (alumno), calificar (alumno), compartir (), guiar (profesor),
- Director: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, nivel_academico, salario, personal_a_cargo, asistencia_trabajo, ⇒ enseñar (alumno), evaluar (alumno), educar (alumno), calificar (alumno), compartir (), dirigir (jefe_estudios), dirigir (jefe_seminario), dirigir (profesor), gestionar (), informar(administrador)
- Secretario: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, salario, nivel_academico, asistencia_trabajo, ⇒ imprimir, editar, mecanografiar, comunicar,
- Administrador: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, salario, asistencia_trabajo, ⇒ administrar, publicitar, contratar (personal)
- Bedel: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, tasa_aprobado, nivel_academico, salario, asistencia_trabajo, ⇒ gestion_accesos, distribuir(documentacion),
- Padres: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, telefono_contacto, nivel_academico, profesión ⇒ llevar_colegio (alumno), educar (alumno), colaborar (profesor), pagar (administrador),
- ATS: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, salario, asistencia_trabajo, nivel_academico ⇒ prevenir, sanar, educar,
- Vigilante_patio: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, salario, asistencia_trabajo, ⇒ prevenir, vigilar, educar(alumno)
- Telefonista: nombre, apellidos, edad*, fecha_nacimiento, genero, domicilio, salario, asistencia_trabajo, ⇒ atender(telefono), atender(personas),
- Patio: largo, ancho, pergola, mobiliario
- Comedor: largo, ancho, altura, capacidad, mobiliario
- Gimnasio: largo, ancho, altura, capacidad, mobiliario
- Despacho: largo, ancho, altura, mobiliario
- Aula: largo, ancho, altura, capacidad, mobiliario