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

Eval 3 - Programacion - Informe

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

Programación

PNF Electricidad T3-F2-MN

PROGRAMACIÓN ORIENTADA A OBJETOS (POO)

Profesora: Hecho por:

Yesmary Guevara. Francisco López CI 26605897

Elisai Puesme CI 28350636

Fabián Gómez CI 30363496

El Tigre, febrero de 2024.


INTRODUCCIÓN

La Programación Orientada a Objetos (POO) es un paradigma de


programación que organiza el código en torno a “objetos”, que son entidades
que contienen datos y métodos. Este paradigma se basa en cuatro pilares
fundamentales:

1. Encapsulamiento: Los datos y métodos de un objeto se ocultan al resto


del programa, solo se puede acceder a ellos a través de interfaces
públicas.
2. Herencia: Los objetos pueden heredar características de otros objetos,
lo que permite reutilizar el código y crear jerarquías de clases.
3. Polimorfismo: Los objetos pueden responder a diferentes mensajes de
la misma manera, dependiendo de su tipo.
4. Modularidad: El código se divide en módulos independientes y
reutilizables, lo que facilita el mantenimiento y la comprensión del
programa.

Así bien, hay otros puntos a tratar cuando se habla de las POO, por ejemplo:
El modelo computacional del paradigma orientado a objetos ¿De qué trata?
Pues los objetos se comunican entre sí enviando mensajes. Un mensaje es
una solicitud para que un objeto realice una acción.

Por otro lado tenemos la comparación de la POO con otros paradigmas (Sí,
existen otros paradigmas de programación), existe la programación procedural
el cual es otro tipo de paradigma, pero la POO ofrece una serie de ventajas
sobre otros tipos de programación que veremos más adelante.

Además de estos puntos tenemos el polimorfismo, su comparación con la


sobrecarga de identificadores y sus referencias polimórficas.
PROGRAMACIÓN ORIENTADA A OBJETOS

Modelo computacional:

En la POO, los objetos son entidades independientes que encapsulan datos y


comportamiento. Imaginemos un objeto que representa un coche. Este objeto
tendría atributos como la marca, el modelo, el color y la velocidad. También
tendría métodos como arrancar, acelerar, frenar y girar.

Los objetos interactúan entre sí enviando mensajes. Un mensaje es una


solicitud que un objeto envía a otro para que realice una acción. Por ejemplo,
el objeto "conductor" podría enviar un mensaje al objeto "coche" para que
acelere.

Encapsulamiento:

El encapsulamiento es una característica fundamental de la POO que permite


ocultar los detalles de implementación de un objeto. Los detalles de cómo un
objeto implementa sus métodos y almacena sus datos son irrelevantes para
otros objetos. Esta característica facilita la creación de código modular y
reutilizable.

Reusabilidad y Modularidad:

La POO facilita la reutilización del código mediante dos mecanismos


principales:

• Clases: Las clases son plantillas que definen la estructura y el


comportamiento de los objetos. Una vez que se define una clase, se
puede utilizar para crear tantos objetos como se necesiten.

• Herencia: La herencia permite que una clase herede las características


de otra clase. Esto facilita la creación de nuevas clases a partir de
clases existentes, lo que reduce la duplicación de código.
La modularidad se refiere a la capacidad de dividir un programa en partes
independientes. La POO facilita la modularidad mediante el encapsulamiento
y las interfaces.

Ejemplos de Reusabilidad y Modularidad:

• Clases: Una clase Persona podría tener atributos como nombre, edad
y dirección. Esta clase podría ser utilizada para crear objetos que
representen a diferentes personas.

• Herencia: Una clase Estudiante podría heredar de la


clase Persona. La clase Estudiante tendría atributos adicionales como
la matrícula y la carrera.

• Encapsulamiento: La clase Coche podría encapsular los detalles de


cómo implementa el método acelerar. Otros objetos no necesitan saber
cómo funciona este método, solo necesitan saber que pueden enviarle
un mensaje para que acelere.

Arquitectura Cliente/Servidor:

La arquitectura cliente/servidor es un modelo de diseño de software en el que


los objetos se dividen en dos categorías:

• Clientes: Los clientes son objetos que solicitan servicios a otros


objetos.

• Servidores: Los servidores son objetos que proporcionan servicios a


otros objetos.

Ejemplo de arquitectura cliente/servidor:

• Un cliente web podría ser un objeto que solicita una página web a un
servidor web.

• Un servidor web podría ser un objeto que proporciona páginas web a


los clientes web.
Ventajas de la arquitectura cliente/servidor:

• Escalabilidad: La arquitectura cliente/servidor es escalable porque se


pueden agregar nuevos servidores para aumentar la capacidad del
sistema.

• Flexibilidad: La arquitectura cliente/servidor es flexible porque los


clientes y los servidores se pueden conectar entre sí de forma dinámica.

• Reusabilidad: La arquitectura cliente/servidor facilita la reutilización del


código porque los servidores se pueden implementar como módulos
independientes.

Objetos

En el paradigma de programación orientada a objetos (POO, o bien OOP en


inglés), un objeto es un ente orientado a objetos (programa de computadoras)
que consta de un estado y de un comportamiento, que a su vez constan
respectivamente de datos almacenados y de tareas realizables durante el
tiempo de ejecución. Un objeto puede ser creado instanciando una clase,
como ocurre en la programación orientada a objetos, o mediante escritura
directa de código y la replicación de otros objetos, como ocurre en la
programación basada en prototipos.

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
Clases

En la programación orientada a objetos, una clase es una plantilla o modelo


para crear objetos. Una clase define un conjunto de atributos (datos) y
métodos (comportamientos) que los objetos pueden tener. Los atributos de
una clase son las características o propiedades que los objetos de esa clase
tienen. Los métodos son las acciones que los objetos pueden realizar.

Ejemplo:

Un ejemplo de una clase en POO podría ser una clase Coche. Un coche tiene
ciertas características como el modelo, la marca, la matrícula, el color, etc.
También puede realizar ciertas acciones como acelerar, frenar, girar, etc.

La clase Coche podría definirse así en Python:

class Coche:

def __init__(self, marca, modelo, matricula, color):

self.marca = marca

self.modelo = modelo

self.matricula = matricula

self.color = color

def acelerar(self):

print("El coche está acelerando")

def frenar(self):

print("El coche está frenando")

def girar(self, direccion):

print(f"El coche está girando hacia {direccion}")


En este ejemplo, la clase Coche tiene cuatro atributos: marca, modelo,
matricula y color. También tiene tres métodos: acelerar, frenar y girar. El
método __init__ es el constructor de la clase, que se llama automáticamente
cuando se crea un objeto de la clase. En este ejemplo, el constructor toma los
valores de los atributos como argumentos.

Instancia

Una instancia en programación es un objeto individual creado a partir de una


clase que actúa como una plantilla. Cada instancia tiene sus propios valores y
propiedades, lo que le permite representar objetos únicos en un programa.

Como ya hemos comentado, los objetos son ejemplares de una clase. Así
pues, a la hora de crear un objeto, debemos seguir los siguientes pasos:

1) Declarar el objeto.

1. Persona persona1;

2) Instanciar el objeto (crear un objeto a partir de una clase).

1. persona1 = new Persona("David");

En la mayoría de lenguajes, para instanciar/crear un objeto nuevo debemos


escribir la palabra new seguida de uno de los constructores de la clase. En
este caso, hemos usado uno de los dos constructores con argumentos, pero
también podríamos haber usado el constructor por defecto.

3) En este momento ya tenemos el objeto persona1 del tipo Persona creado


en memoria. Así pues, ya podemos acceder a sus atributos y métodos.

Los pasos 1 y 2 se pueden agrupar en un único paso:


1. Persona persona1 = new Persona("David");

Debido a que la acción de crear un objeto a partir de una clase se le llama


instanciar, muchas veces a los objetos se les llama instancia. Así pues,
persona1 es una instancia o un objeto de Persona.

Mensajes

Un mensaje es una petición enviada a un objeto para que este se comporte de


una determinada manera, realizando una de sus operaciones. Si el receptor
de la solicitud acepta el mensaje, aceptará la responsabilidad de llevar a cabo
la acción. En respuesta al mensaje, el receptor se comportará de una
determinada forma.

Cada mensaje consta de tres partes:

1. Identidad del objeto al que va dirigido el mensaje.

2. Operación solicitada (método).

3. Información adicional (argumentos), necesaria para poder ejecutar el


método.

Su sintaxis algorítmica es:

<Variable_Objeto>.<Nombre_Método> ( [<Lista de Parámetros> ] );

Cuando el objeto receptor recibe el mensaje, comienza la ejecución del


algoritmo contenido dentro del método invocado, recibiendo y/o devolviendo
los valores de los parámetros correspondientes, si los tiene ya que son
opcionales: ( [ ] )

Método

Un método es una función que se define dentro de una clase y se utiliza para
representar el comportamiento de un objeto. Los métodos se utilizan para
realizar tareas específicas en un objeto, como cambiar el estado de un objeto,
calcular un valor, interactuar con otros objetos, etc.

La estructura más interna de un objeto esta oculta para otros usuarios y la


única conexión que tiene con el exterior son los mensajes. Los datos que están
dentro de un objeto solamente pueden ser manipulados por los métodos
asociados al propio objeto.

Variables de instancia

También llamadas atributos o variables de objeto, estas variables representan


la información particular de cada una de las instancias de una clase, como por
ejemplo, el nombre de cada ser humano, el color de una silla o el importe total
de una factura.

Cuando creamos una clase en Python, lo más común es inicializar los atributos
o variables de instancia en el método de inicialización __init__, aunque
también podrían crearse variables de instancia en otros métodos de instancia.

Vamos a verlo con un ejemplo. Crearemos una clase para representar un


semáforo de tráfico. La información que nos interesa almacenar es su estado
actual, que es su color, es decir, si su luz está en rojo, en amarillo o en verde.
Con esto creamos la clase Semaforo inicializando su variable luz a rojo (por
defecto cualquier semáforo recién creado tendrá su luz en rojo).
Proporcionaremos además un método cambiar para poder cambiar su luz
cuando lo necesitemos:
Desde el momento en que la variable está creada e inicializada podemos
acceder a ella a través del nombre del objeto o de la instancia. Por supuesto,
previamente hay que crear dicha instancia. Además, podremos invocar a la
función de cambio de estado para alterar el valor de dicha variable. A
continuación creamos dos instancias diferentes, cambiamos la luz a una de
ellas y mostramos por pantalla el color de la luz de cada instancia:

El código anterior generará el siguiente resultado por pantalla:

Creación de objetos

Un objeto se crea utilizando la instrucción new y dando el nombre de


la clase de la cual va a ser una instancia. Todas las clases tienen
un método constructor por defecto, sin necesidad de que el programador
tenga que crearlo. Como no es responsabilidad del computador darle un
valor inicial a los atributos, cuando se usa este constructor, éstos quedan en
un valor que se puede considerar indefinido. A continuación se muestra el
resultado del llamado a este constructor.

• El resultado de ejecutar la instrucción del ejemplo es un nuevo objeto,


con sus atributos no inicializados.
• Dicho objeto está "referenciado" por p, que puede ser un atributo o
una variable de tipo Producto.

Destructor de objetos

Un destructor, como su propio nombre implica, se utiliza para destruir


objetos que han sido creados por un constructor. Al igual que un constructor,
el destructor es una función miembro cuyo nombre es el mismo que el
nombre de la clase, pero precedida por una tilde (~).

Por ejemplo, el destructor de la clase entero puede ser definido tal y como
se muestra a continuación.
~entero(){}

Un destructor nunca tiene argumentos y no devuelve ningún valor. Será


invocado de forma implícita por el compilador cuando el programa finaliza (o
el bloque o la función, dependiendo del caso) para limpiar la zona de
memoria ocupada que ya no es accesible.

Es muy buena práctica de programación declarar destructores en un


programa, ya que liberará el espacio de memoria para su futuro uso.

Igualdad e identidad

Dos objetos se consideran iguales si sus valores son comparables. Esto


significa que, si se comparan utilizando el operador ==, el resultado será
True.

Ejemplos de igualdad:

# Números

1 == 1 # True

2.5 == 2.5 # True

# Cadenas
“Hola” == “Hola” # True

# Listas

[1, 2, 3] == [1, 2, 3] # True

Dos objetos se consideran idénticos si son el mismo objeto en la memoria.


Esto significa que, si se comparan utilizando el operador is, el resultado será
True.

Ejemplos de identidad:

# Variables que apuntan al mismo objeto

A=1

B=1

A is b # True

# Listas que son el mismo objeto

A = [1, 2, 3]

B=a

A is b # True

Diferencias:

• La igualdad se basa en el valor de los objetos.


• La identidad se basa en la ubicación en la memoria de los objetos.
• Dos objetos pueden ser iguales pero no idénticos.
• Dos objetos idénticos siempre son iguales.
Herencia

La herencia es el mecanismo de implementación mediante el cual elementos


más específicos incorporan la estructura y comportamiento de elementos
más generales (Rumbaugh 99).

Gracias a la herencia es posible especializar o extender la funcionalidad de


una clase, derivando de ella nuevas clases.

La herencia es siempre transitiva: una clase puede heredar características


de superclases que se encuentran muchos niveles más arriba en la jerarquía
de herencia.

Ejemplo: si la clase Perro es una subclase de la clase Mamífero, y la clase


Mamífero es una subclase de la clase Animal, entonces el Perro heredará
atributos tanto de Mamífero como de Animal.

Generalización y especialización

La generalización es la propiedad que permite compartir información entre


dos entidades evitando la redundancia.

En el comportamiento de objetos existen con frecuencia propiedades que


son comunes en diferentes objetos y esta propiedad se denomina
generalización.

Por ejemplo, máquinas lavadoras, frigoríficos, hornos de microondas,


tostadoras, lavavajillas, etc., son todos electrodomésticos (aparatos del
hogar).

En el mundo de la orientación a objetos, cada uno de estos aparatos es una


subclase de la clase Electrodoméstico y a su vez Electrodoméstico es una
superclase de todas las otras clases (máquinas lavadoras, frigoríficos,
hornos de microondas, tostadoras, lavavajillas,).
El proceso inverso de la generalización por el cual se definen nuevas clases
a partir de otras ya existentes se denomina especialización.

Superclase y subclase

Una cosa que debemos tener clara a la hora de meternos en las lides de la
herencia es que no existe propiamente un tipo de clase llamado sub-clase o
super-clase. Estos conceptos se utilizan para definir la relación que existe
entre dos clases concretas. Una sub-clase es simplemente la que hereda de
otra clase, a la que llamaremos super-clase; dicho de otro modo, la super-clase
es la clase madre y la sub clase la clase hija. Igual como ocurre en el resto de
las relaciones, nuestra sub-clase puede ser al mismo tiempo una super-clase
para otras clases, y así sucesivamente. Esto es algo que veremos muy
comúnmente en la POO donde, por ejemplo, todas las clases derivan, en algún
punto de la clase Object.

Terminología importante:

Superclase: la clase cuyas características se heredan se conoce como


superclase (o una clase base o una clase principal).

Subclase: la clase que hereda la otra clase se conoce como subclase (o una
clase derivada, clase extendida o clase hija). La subclase puede agregar sus
propios campos y métodos, además de los campos y métodos de la
superclase.

Herencia simple

La herencia simple es la más típica, la que se puede encontrar en cualquier


lenguaje moderno como Java o C#. La herencia simple es una relación entre
una clase padre (clase base) y una clase hija (clase derivada) llamada "es un
tipo de", que muchas veces se abrevia como isA. La herencia es simple
cuando la clase derivada que estamos considerando sólo tiene una clase base.

Herencia múltiple

Cuando se deriva una clase usando varias clases bases la misma se denomina
herencia múltiple. Usando la herencia múltiple una clase derivada recibe los
atributos de dos o más clases bases. Si se utiliza la herencia múltiple para
derivar una clase el constructor de la clase derivada deberá llamar a los
constructores de cada una de las clases bases.
Interfaz

Las Interfaces son usadas para indicar qué métodos debe obligatoriamente
implementar (contener) una Clase (aunque no tienen por qué comportarse del
mismo modo).

Los métodos definidos en una una Interface deben ser public.

En lenguajes de Programación Orientada a Objetos que no soportan herencia


múltiple (como Java) se usa también para simularla.

Veamos a continuación un ejemplo en lenguaje Java en el que creamos una


interface IEmpleado que es implementada por las clases Carpintero y
Fontanero, las cuales además heredan de Persona.
Redefinición de métodos

La redefinición de métodos, también conocida como sobreescritura o override,


es un concepto fundamental en la programación orientada a objetos (POO)
que permite modificar el comportamiento de un método heredado de una clase
padre en una clase hija.

Las principales razones para redefinir métodos son:

• Especialización: Adaptar el comportamiento de un método general a las


necesidades específicas de la subclase.
• Extensión: Agregar nueva funcionalidad al método original sin modificar
la clase padre.
• Corrección de errores: Solucionar errores o problemas en la
implementación del método en la superclase.
• Optimización: Mejorar el rendimiento del método para un caso particular
en la subclase

Ejemplo práctico:
Supongamos que tenemos una clase padre Animal con un método comer().
La clase hija Perro hereda este método, pero queremos que los perros tengan
un comportamiento específico al comer, como ladrar antes de hacerlo. Para
esto, podemos redefinir el método comer() en la clase Perro de la siguiente
manera:

class Animal:

def comer(self):

print("El animal está comiendo")

class Perro(Animal):

def comer(self):

print("El perro ladra")

super().comer() # Invoca el método comer de la clase padre

perro = Perro()

perro.comer() # Imprime "El perro ladra" y luego "El animal está comiendo"

This y Super

Super indica que una variable o método es de la clase padre, la superclase de


cual heredan nuestras subclases, solo la usamos cuando aplicamos herencia.

Además, podemos llamar al constructor de la clase padre desde sus diferentes


subclases usando super(); y enviando los argumentos que sean necesarios.

Por otro lado, this nos permite especificar que nuestras variables están
señalando a la misma clase donde estamos trabajando, ya sea una clase
normal, anidada, subclase o superclase.
Concepto de Polimorfismo:

El polimorfismo es una característica fundamental de la programación


orientada a objetos (POO) que permite que una acción se realice de diferentes
maneras dependiendo del contexto. En términos más simples, significa que
una variable o función puede tener diferentes comportamientos dependiendo
del tipo de objeto al que se refiere.

Ejemplo:

Imagina un objeto Coche con un método encender(). Este método podría


encender el motor de un coche de gasolina, arrancar el motor eléctrico de un
coche eléctrico o iniciar el sistema de propulsión de un vehículo espacial. El
mismo método encender() se comporta de manera diferente en cada caso,
dependiendo del tipo de objeto al que se aplica.

Tipos de Polimorfismo:

• Polimorfismo de inclusión: Ocurre cuando un objeto puede ser tratado


como un objeto de una clase más general. Por ejemplo, un
objeto Coche puede ser tratado como un objeto Vehículo.

• Polimorfismo de subtipo: Ocurre cuando una variable puede contener


un objeto de cualquier clase que sea subtipo de una clase dada. Por
ejemplo, una variable de tipo Vehículo puede contener un
objeto Coche, Camión o Motocicleta.

Binding Estático vs. Dinámico:

• Binding estático: La vinculación se realiza en tiempo de compilación. El


tipo de objeto que se utiliza se determina en el momento en que se
escribe el código.

• Binding dinámico: La vinculación se realiza en tiempo de ejecución. El


tipo de objeto que se utiliza se determina en el momento en que se
ejecuta el código.

Ejemplo:

En el siguiente código Java, la variable coche está ligada estáticamente a la


clase Coche.

Java

Coche coche = new Coche();

En el siguiente código Python, la variable vehiculo puede contener un objeto


de cualquier clase que sea subtipo de Vehiculo.
Python

vehiculo = Coche()

Polimorfismo vs. Sobrecarga de Identificadores:

• Polimorfismo: Se refiere a la capacidad de una acción de comportarse


de diferentes maneras dependiendo del contexto.

• Sobrecarga de identificadores: Se refiere a la capacidad de usar el


mismo nombre para diferentes funciones o métodos con diferentes
parámetros.

Ejemplo:

En el siguiente código C++, la función sumar() está sobrecargada para aceptar


diferentes tipos de datos como argumentos.

C++

int sumar(int a, int b);

double sumar(double a, double b);

Referencias Polimórficas:

Las referencias polimórficas son variables que pueden contener referencias a


objetos de diferentes tipos.

Ejemplo:

En el siguiente código Java, la variable referencia puede contener una


referencia a un objeto Coche, Camión o Motocicleta.

Java

Vehiculo referencia;
Ventajas del Polimorfismo:

• Flexibilidad: Permite escribir código más flexible y adaptable.

• Reusabilidad: Permite crear código más reutilizable.

• Extensibilidad: Facilita la extensión del código con nuevas


funcionalidades.

Desventajas del Polimorfismo:

• Complejidad: Puede aumentar la complejidad del código.

• Dificultad de depuración: Puede dificultar la depuración de errores.

Recomendaciones para el uso del Polimorfismo:

• Utilizar el polimorfismo de forma moderada.

• Documentar cuidadosamente el código que utiliza polimorfismo.

• Utilizar herramientas de depuración para detectar errores relacionados


con el polimorfismo.

Tipos de relaciones:

En la POO, las relaciones entre objetos se pueden clasificar en tres categorías


principales:

Asociación

Es una relación entre dos objetos que no implica propiedad. En otras palabras,
los objetos no se "pertenecen" entre sí.

Ejemplo:
Un objeto Persona puede tener una relación de asociación con un objeto
Coche. La persona puede conducir el coche, pero el coche no "pertenece" a
la persona.

Agregación

Es una relación entre dos objetos en la que un objeto "contiene" al otro. El


objeto contenedor se denomina "agregado" y el objeto contenido se denomina
"componente".

Ejemplo:

Un objeto Coche puede tener una relación de agregación con un objeto Motor.
El motor es un componente del coche y no puede existir independientemente
del coche.

Composición

Es una relación entre dos objetos en la que un objeto "es parte" del otro. El
objeto que es parte del otro se denomina "parte" y el objeto del que forma parte
se denomina
CONCLUSIÓN

La Programación Orientada a Objetos (POO) es un paradigma de desarrollo


de software que organiza el código en torno a objetos, entidades que
encapsulan datos y comportamiento. Este enfoque modular y flexible ofrece
un conjunto de ventajas para la creación de software complejo y escalable.

Algunos aspectos claves que aprendimos de la POO pueden ser que, los
objetos son entidades que encapsulan datos y comportamiento. Las clases
son plantillas que definen la estructura y el comportamiento de objetos, y que
la herencia es el mecanismo para crear nuevas clases a partir de clases
existentes, puede decirse que estos son los tres pilares bases de la POO.

Además nos deja claro que el polimorfismo es una capacidad de los objetos
para responder al mismo mensaje de forma diferente, por otro lado, el
encapsulamiento es la protección de los detalles internos de los objetos, la
reutilización es la creación de clases generales y reutilizables, y la modularidad
viene siendo la división del código en unidades independientes.

Por otro lado, la POO puede ser más compleja de aprender y comprender que
otros paradigmas de programación y puede ser menos o más eficiente que la
programación procedural en algunos casos específicos, además el uso
excesivo de la herencia y el polimorfismo puede dificultar la lectura y el
mantenimiento del código.

En resumen, la POO es un paradigma de programación fundamental para el


desarrollo de software moderno. Ofrece un conjunto de ventajas que la
convierten en una herramienta poderosa para la creación de aplicaciones
escalables, flexibles y fáciles de mantener.
REFERENCIAS ELECTRÓNICAS

http://cv.uoc.edu/annotation/cb7a0462407a23d1f3fc46cb1d4e01f8/645413/PI
D_00249622/PID_00249622.html

https://programacion.top/conceptos/instancia/

https://es.wikipedia.org/wiki/Objeto_(programaci%C3%B3n)

https://programacion.top/orientada-objetos/clase/

https://programacion.net/articulo/programacion_orientada_a_objetos_279#:~:
text=Los%20objetos%20son%20instancias%20de,color%20de%20pelo%2C
%20una%20altura.

https://prezi.com/nm2sndpntwsx/mensajes-en-el-contexo-programacion-
orientada-a-objetos/

https://www.codigopiton.com/variables-de-clase-y-de-instancia-en-python/

https://universidad-de-los-andes.gitbooks.io/fundamentos-de-
programacion/content/Nivel2/6_ClasesYObjetos.html

http://cidecame.uaeh.edu.mx/lcc/mapa/PROYECTO/libro15/25_destructores.
html

https://edukativos.com/apuntes/archives/3707

https://www.studocu.com/es-mx/document/instituto-tecnologico-superior-de-
tierra-blanca/programacion-avanzada/32-clasificacion-herencia-simple-
herencia-multiple/28326902

https://informaticapc.com/poo/interfaces.php

https://platzi.com/clases/1629-java-oop/21575-super-y-
this/#:~:text=super%3A%20es%20la%20palabra%20reservada,en%20la%20
que%20se%20utiliza.

También podría gustarte