Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

16-Programacion Orientada A Objetos-2023

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 27

Embedded C

Programming
Programación Orientada a Objetos en C

Programación Orientada a Objetos en C

Programming
Programación en Lenguaje C - Programación Orientada a Objetos

Programación Estructurada

La programación estructurada es una forma disciplinada de desarrollo de software que enfatiza dos aspectos
separados y distintos: funciones o procedimientos y la estructuración de datos.

Programación Orientada a Objetos

La programación orientada a objetos se basa en un paradigma ortogonal. En lugar de tener dos taxonomías
separadas, la programación orientada a objetos tiene una única basada en la noción de clase.

Programming
Programación en Lenguaje C - Programación Orientada a Objetos

Lenguaje C

El lenguaje C es claramente un lenguaje estructurado. C es, por mucho, el lenguaje más común para la creación de
sistemas embebidos. Tiene todas las asignaciones: funciones, variables, etc.

Sin embargo surge la pregunta:

¿se puede realizar la programación orientada a objetos en un lenguaje estructurado, como C?

E incluso si se puede hacer,

¿debería hacerse?

Programming
Programación en Lenguaje C - Programación Orientada a Objetos

Lenguaje C orientado a objetos

Definitivamente si se puede realizar programación orientada a objetos en un lenguaje estructurado como C.


Adoptar un estilo de programación orientado a objetos en el Lenguaje C proporciona varias beneficios. Requiere
de disciplina por parte del programador para comprender el mecanismo del paradigma orientado a objetos y
como realizar su implementación en un lenguaje estructurado.

Programming
Programación en Lenguaje C - Clases

Clases

Programming
Programación en Lenguaje C - Clases

Clases

Una clase no es más que una estructura en C, pero lo que tiene de especial es que contiene dos tipos diferentes de
características: datos (atributos) y comportamientos (operaciones).

La manera más simple de implementar clases en C (sin estructuras) es simplemente utilizar los archivos como
límite de encapsulación; las variables y funciones públicas se pueden hacer visibles en el archivo de encabezado,
mientras que el archivo de implementación contiene los cuerpos de las funciones y las variables y funciones
privadas.

Programming
Programación en Lenguaje C - Clases

.h sensor.h
Clases Atributos y
métodos int getVal(void);
públicos int init(void);

.c main.c int val;

#include ”sensor.h”
.c sensor.c
int main(void)
{ #include ”sensor.h”
int x = getVal(); int w,y,z;
}
int getVal(void){…}
Atributos int init(void){…}
privados

Programming
Programación en Lenguaje C - Clases

Clases representadas con estructuras

Un enfoque más elegante utiliza estructuras dentro de los archivos para representar las clases. Las operaciones de
la clase se definen como funciones ubicadas dentro del mismo archivo que la estructura.

Programming
Programación en Lenguaje C - Objetos

Objetos

Programming
Programación en Lenguaje C - Objetos

Objetos

En Programación Orientada a Objetos, los objetos son instancias de clases. Podemos declarar un objeto como una
simple variable de algún tipo de dato ordinario como int. Pero como bien comentamos, en C, las clases se
representan mejor como estructuras; por lo que crear un objeto instanciado a estructura puede ser mejor
representación.

Siempre que hablamos de objetos también hablamos de su tipo. Por lo que nuevamente el tema de tipo de dato
sale a la luz.

Programming
Programación en Lenguaje C - Objetos

¿Qué es un tipo de dato?

Revisemos un poco la definición de tipo de dato:

“A data type is a bundle of compile-time properties for an object” - Dan Saks

Normalmente en el mundo de lenguajes estructurados como C, estamos acostumbrados a que las únicas
propiedades que proporciona un tipo de dato a una variable u objeto son:

• Tamaño y alineación en memoria


• Conjunto de valores válidos

Sin embargo, una definición más interesante puede ser la siguiente:

• Conjunto de operaciones permitidas

Programming
Programación en Lenguaje C - Objetos

¿Qué es un tipo de dato?

Por ejemplo para un microcontrolador típico de 8-bit y 16-bit un int tiene las siguientes propiedades:

• Tamaño y alineación de 2 bytes


• Valores válidos: -32768 – 32767 (sólo enteros)
• Operaciones:
• Unarias: + - ! ~ & ++ --
• Binarias: + - * / % < > == != & | && ||

Lo que un tipo puede hacer es tan importante como lo que no puede hacer, por ejemplo un int no puede:

• Realizar desreferencia como si fuera un puntero : *i


• Seleccionar un miembro como si fuera unión o estructura: i.m
• Llamarlo como si fuera función: i()

Programming
Programación en Lenguaje C - Objetos

¿Qué es un tipo de dato? .c main.c

En este ejemplo se declara el objeto obj_sensor del tipo


sensor_t, por lo tanto decimos que obj_sensor está typedef struct
instanciado a la clase sensor. {
int value;
sensor_t es un tipo definido por typedef, en este caso int threshold;
una re-definición del tipo struct. Esto quiere decir que los
int (*getVal)(void);
objetos instanciados tienen permitido hacer las operaciones
que están permitidas para las estructuras, y serán }sensor_t;
reestringidos de hacer operaciones que no son propias de las
estructuras. int main(void)
{
Una de las cosas que el objeto podrá hacer es acceder y sensor_t obj_sensor;
manipular a los atributos y operaciones que se encuentran }
declaradas como miembros de la estructura, al igual que lo
hacen en los lenguajes orientados a objetos.

Programming
Programación en Lenguaje C - Clases

Práctica de Laboratorio:
LAB-POO-clases: El objetivo de esta práctica de laboratorio es estudiar la implementación de clases y objetos en
C. Crear 2 clases: perro y gato con propiedades y métodos.

Programming
Programación en Lenguaje C - Herencia

Herencia

Programming
Programación en Lenguaje C - Herencia

Herencia

El término herencia (inheritance) también se conoce como subclasificación (subclassing) y en el mundo del
modelado en ocasiones se le da el término de generalización (generalization).

La herencia permite que una clase (clase hija) herede las característica de una clase más general (clase padre), es
decir, todas las características de la clase padre (también conocida como clase base o principal) también son
características de la clase hija (también conocida como clase derivada o secundaria), pero a esta última se le
permite tanto especializarse como extender la clase padre.

Programming
Programación en Lenguaje C - Herencia

Ventajas de la Herencia

Una de las ventajas de la herencia es la capacidad de reutilizar el diseño y el código. Si diseñó una clase para un
contexto específico y quiero reutilizarla más tarde en un contexto diferente, puedo simplemente diseñar y
codificar las especializaciones y extensiones sin tocar la clase base.

La subclase puede redefinir las operaciones proporcionadas por la clase base. Debido a que una subclase es una
forma especializada de una clase base, cualquier operación que tenga sentido para una instancia de la clase base
también debería tener sentido con una instancia de la clase derivada.

Programming
Programación en Lenguaje C - Herencia

.c perro.c
.h animal.h
typedef struct
{
//perro hereda de animal typedef struct
animal_t animal; {
char *tipoLadrido; int id;
}perro_t; unsigned char nombre[10];
int edad;
}animal_t; //clase padre
.c gato.c
typedef struct
{
//gato hereda de animal La herencia se puede llevar a cabo en C a
animal_t animal;
través de estructuras anidadas.
char *tipoMaullido;
}gato_t;

Programming
Programación en Lenguaje C - Herencia

Práctica de Laboratorio:

LAB-POO-herencia: El objetivo de esta práctica de laboratorio es estudiar la implementación de herencia en C.

Programming
Programación en Lenguaje C – Polimorfismo

Polimorfismo

Programming
Programación en Lenguaje C – Polimorfismo

Polimorfismo y Funciones Virtuales

El polimorfismo es una característica valiosa de los lenguajes orientados a objetos. Permite que el mismo nombre
de función represente una función en un contexto y otra función en un contexto diferente. En la práctica, esto
significa que cuando cambia el contexto estático o dinámico de un elemento, se puede llamar a la operación
apropiada. Las funciones con esta característica se llaman funciones virtuales.

Entonces podemos decir que las funciones virtuales (también conocidas como funciones abstractas), son
funciones de una clase (o también de una interfaz en Java) que no tienen implementación o de definición, es decir,
sólo tienen declaración.

La implementación o definición de una función virtual será definida en una subclase que hereda de la clase base
donde se declaró la función virtual.

Programming
Programación en Lenguaje C – Polimorfismo

Polimorfismo y Funciones Virtuales

Por supuesto, la forma estándar de hacer esto en C es usar declaraciones condicionales como if o switch. El
problema con el enfoque estándar es que rápidamente se vuelve difícil de manejar cuando hay muchos contextos
diferentes disponibles.

Además, el enfoque requiere que se conozcan todos los contextos posibles cuando se escribe la función original, o
al menos la función debe modificarse para permitir un nuevo contexto. Con funciones polimórficas, no se requiere
presciencia. Cuando se descubre el nuevo contexto, la función polimórfica se puede crear y agregar sin requerir
cambios en la función original.

Una mejor forma de implementar funciones virtuales en C es utilizando punteros a función.

Programming
Programación en Lenguaje C – Polimorfismo y Clases Abstractas

Clases abstractas

En lenguajes orientados a objetos, una clase abstracta tiene las siguientes características

• Contiene funciones virtuales (no es una regla obligatoria)


• No se pueden definir instancias u objetos de una clase abstracta

Programming
Programación en Lenguaje C - Polimorfismo y Clases Abstractas

Funciones virtuales

Clase abstracta

Programming
Programación en Lenguaje C - Polimorfismo y Clases Abstractas

.c interfaz_animal.c .h animal.h

typedef enum
const animal_t animal[] = { {
{ PERRO,
.comer = perro_comer, GATO
}TIPO_ANIMAL;
.guardarId = perro_guardarId,
.obtenerId = perro_obtenerId, typedef union
.emitir_sonido.ladrar = ladrar {
}, void(*ladrar) (void);
void(*maullar)(void);
{
}emitir_sonido_t;
.comer = gato_comer,
.guardarId = gato_guardarId, typedef struct //clase abstracta
.obtenerId = gato_obtenerId, {
.emitir_sonido.maullar = maullar int id;
unsigned char nombre[10];
} int edad;
void (*comer)(void);
}; void (*guardarId)(int id);
int (*obtenerId)(void);
emitir_sonido_t emitir_sonido;
}animal_t;
extern const animal_t animal[];

Programming
Programación en Lenguaje C - Polimorfismo y Clases Abstractas

.c main.c

animal[PERRO].comer();
animal[PERRO].guardarId(55);
animal[PERRO].emitir_sonido.ladrar();
Funciones virtuales
(Reutilización de funciones en
animal[GATO].comer();
animal[GATO].guardarId(56); diferentes contextos)
animal[GATO].emitir_sonido.maullar();

Programming
Programación en Lenguaje C - Polimorfismo y Clases Abstractas

Práctica de Laboratorio:

LAB-POO-polimorfismo: El objetivo de esta


práctica de laboratorio es estudiar la
implementación de polimorfismo en C.

Programming

También podría gustarte