QT Capitulo 08
QT Capitulo 08
CAPITULO VIII
I. CONTENIDO
Temas Habilidades
Los conceptos de la programación orientada a objetos (POO) tienen origen en Simula 67,
un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen
Nygaard del Centro de Cómputo Noruego en Oslo. Según se informa, la historia es que
trabajaban en simulaciones de naves, y fueron confundidos por la explosión combinatoria
de cómo las diversas cualidades de diversas naves podían afectar unas a las otras. La idea
surgió al agrupar los diversos tipos de naves en diversas clases de objetos, siendo
responsable cada clase de objetos de definir sus propios datos y comportamiento. Fueron
refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (y cuya
primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente
dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener
un sistema basado en programas estáticos.
La POO es una forma especial de programar, más cercana a como expresaríamos las cosas
en la vida real que otros tipos de programación. Con la POO tenemos que aprender a
pensar las cosas de una manera distinta, para escribir nuestros programas en términos
de objetos, propiedades, métodos y otras cosas que veremos rápidamente para aclarar
Los objetos en programación, son modelados observando objetos del mundo real,
por ejemplo implementamos el objeto "perro" dentro de nuestro programa
definiendo los atributos y métodos del objeto perro real.
METODO ATRIBUTOS
S
Un ejemplo más real es el objeto cuenta bancaria que tendría como atributos: tipo,
número, titular, saldo, etc.; y métodos: depositar, retirar, etc.
Un objeto por si solo no tiene mucho significado. Ejemplo: el objeto "auto" no tiene
mucho sentido si no interactúa con un objeto "persona" que maneje.
➢ Clases, una clase es algo abstracto que define la "forma" del objeto, se podría
hablar de la clase como el molde de los objetos.
Las fabricas de bicicletas utilizan moldes para producir sus productos en serie, de
la misma forma en POO utilizaremos la clase bicicleta (molde) para producir sus
instancias (objetos).
Ejemplo: Podríamos tener la clase Perro, una instancia de esta clase podría ser el
objeto perro llamado "Chicho". La clase Perro especificaría que todos los perros
tendrían un nombre, color de pelo, una altura. Mientras que la instancia "Chicho"
contendrá valores específicos para cada uno de estos atributos.
Podemos definir a una clase como una plantilla que define variables y métodos
comunes para todos los objetos de cierto tipo.
✓ Modularidad, esto es, el código fuente de un objeto puede ser escrito, así
como darle mantenimiento, independientemente del código fuente de otros
objetos. Así mismo, un objeto puede ser transferido alrededor del sistema
sin alterar su estado y conducta.
Hay dos tipos de herencia: Herencia Simple y Herencia Múltiple. La primera indica
que se pueden definir nuevas clases solamente a partir de una clase inicial mientras
No se esta limitado tampoco a un solo nivel de herencia, se pueden tener todos los
que se consideren necesarios.
Ejemplo: Clase Empleado hereda de clase Persona, y esta a su vez hereda de clase
Animal.
Uno de los objetivos principales de la POO es utilizar una y otra vez el mismo
código. Sin embargo, algunas de las operaciones requieren adaptación para
resolver necesidades particulares. Esta necesidad, se da generalmente entre
superclases y subclases, donde una subclase es una especialización de su
superclase, y puede requerir alcanzar los mismos objetivos, pero con distintos
mecanismos. Por ejemplo, una superclase Rectángulo podría tener una operación
calculoArea() cuyo objetivo es calcular el área del rectángulo, definida como la
multiplicación de los las longitudes de dos lados contiguos. A su vez, la clase
Cuadrado es una subclase de Rectángulo que también tiene una operación
calculoArea() cuyo objetivo es calcular el área del cuadrado, pero que está definida
especialmente para los objetos del tipo cuadrado como la multiplicación de la
longitud de uno de sus lados por si mismo. Este fenómeno, polimorfismo, se aplica
a una operación que adopta varias formas de implantación según el tipo de objeto,
pero cumple siempre el mismo objetivo.
Una de las ventajas del polimorfismo es que se puede hacer una solicitud de una
operación sin conocer el método que debe ser llamado. Estos detalles de la
implantación quedan ocultos para el usuario y la responsabilidad descansa en el
mecanismo de selección de la implantación. Por ejemplo, al tratar de frenar un
vehículo siempre se debe oprimir el pedal del lado izquierdo y así el vehículo se
detendrá sin importar si los frenos son de tambor o de aire
Polimorfismo significa múltiples formas; en POO esto significa que una operación
puede tener más de un método que la implementa. La propiedad de polimorfismo
permite que cuando se envía un mensaje a un objeto, sólo se decida en tiempo de
ejecución que método se invoca. Este concepto se conoce como encadenamiento
tardío. En lenguajes tradicionales estructurados se hace el encadenamiento
temprano, lo que significa que el encadenador sabe resolver todos los llamados a
rutinas en tiempo de compilación/encadenamiento.
Declaración de clases
Para declarar una clase, todo lo que se necesita es escribir una definición de estructura
y sustituir la palabra reservada struct por class. Por ejemplo, una clase empleado con
campos como el nombre, el departamento, la posición, el una función que nos imprima
la información de este quedaría así:
class Empleado {
char* m_nombre;
char* m_departamento;
char* m_posicion;
long m_salario;
void Imprimir( Empleado infoEmpleado);
}
Cuando usted declara una clase en C++, no se reserva memoria para la clase hasta
que usted crea un objeto de la clase. Crear un objeto de una clase se llama instanciar
un objeto. Un objeto creado de una clase se denomina instancia de una clase. Por
ejemplo, yo puedo tener una instancia de empleado con el valor en m_nombre=Jose,
m_departamento=Sistemas, m_posicion=programador y m_salario=3000 por
ejemplo.
Especificadores de acceso
C++ utiliza especificadores de acceso para permitir controlar a una clase el acceso a
las variables de datos de esa clase. Los especificadores de acceso permiten acceder a
algunos miembros de la clase y restringir el acceso a otros.
class Empleado {
private:
char* m_nombre;
char* m_departamento;
char* m_posicion;
long m_salario;
public:
void ImprimirInfo();
void SetNombre( char* nombre ) { m_nombre = nombre }
void SetDepartamento( char * departamento) { m_departamento =
departamento }
void SetPosicion ( char* posicion ) { m_posicion = posicion }
void SetSalario ( long salario ) { m_salario = salario }
const char* GetNombre( ){ return m_nombre }
const char* GetDepartamento( ){ return m_departamento }
const char* GetPosicion( ){ return m_posicion }
const char* GetSalario( ){ return m_salario }
};
void Empleado::ImprimirInfo( )
{
cout << "Nombre: " << m_nombre << '\n';
cout << "Departamento: " << m_departamento << '\n';
cout << "Puesto: " << m_posicion << '\n';
cout << "Salario: " << m_salario << '\n';
}
Los dos dos puntos ( :: ) se denomina operador de resolución de ambito. Nos indica
que la función que estamos definiendo que en este caso es ImprimirInfo, pertenece a
la clase Empleado.
void main()
{
//creacion de un objeto de la clase Empleado
Empleado empleado12;
Empleado empleado12;
Luego, en las líneas siguientes a la instanciación del objeto, se le asignan los valores
iniciales a sus variables:
//asignacion de valores a las variables miembro
empleado12.SetNombre("Jose");
empleado12.SetDepartamento("Sistemas");
empleado12.SetPosicion("Programador");
empleado12.SetSalario(3000000);
Empleado::ImprimirInfo();
La principal diferencia entre este operador y los operadores punto y flecha es que el
operador de resolución de ambito se utiliza para acceder a miembros de clases, y el
operador punto y flecha para acceder a miembros de objetos específicos.
III. LABORATORIO N° 1
Crear un programa que permita con una clase padre y dos clases hijas.
IV. LABORATORIO N° 2
Crear un programa que permita registrar una estructura de datos de persona en un archivo
binario, ingresando los datos como clases.