Clases Abstractas y Métodos Abstractos en Programación Orientada a Objetos
Resumen
Los Métodos Abstractos son los métodos que debemos implementar obligatoriamente cada vez que usemos nuestras clases abstractas, mientras que los métodos que no sean abstractos van a ser opcionales.
publicabstractclassFigura{abstractvoiddibujar();// obligatoriovoiddibujar3D();// no es obligatorio}classTrianguloextendsFigura{voiddibujar(){// Instrucciones para dibujar el triángulo...}}
Recuerda los métodos abstractos solo se pueden implementar en clases abstractas. Y las clases abstractas no necesitan ser instanciadas para ser implementadas.
La diferencia entre una clase abstracta y una interface, es que al crear un método abstracto en la clase abstracta (super_clase), se obliga heredar este método a las clases hijas (sub_clases), en cambio al implementar una interface en una clase ya sea abstracta o concreta, debemos implementar TODOS los métodos que tenga dicha interface
Justo me estaba preguntando está diferencia, muchas gracias.
NO se obliga a heredar(esto se hace po defecto), se obliga a sobreescribir los métodos abstractos de la superclase
Métodos Abstractos: es obligatorio de implementación
Exacto 👍
Son obligatorios.
Cual es la diferencia entre
Doctor doctor = new Doctor();
y
User user = new Doctor();
Que diferencia hay? que efecto tendria instanciarlo de la clase Doctor y no de User
Bueno, primero debes recordar que User no se puede instanciar por ser una clase abstracta. Luego, en este ejemplo de la clase, explica más el beneficio de los métodos opcionales o no, pero de un caso como el que dices.. Te sirve para generalizar ciertos comportamientos. Si, por ejemplo, tuvieras un metodo que reciba como parametro un Doctor, o un Nurse o un Patient. En vez de hacer polimorfismo del metodo para cada clase, escribirías solo un método que reciba un parámetro de tipo User y así podria recibir un objeto Doctor, Nurse o Patient.
En el ejemplo especifico que pones, no hay diferencia, al final ambos son de tipo Doctor, que a su vez significa que son de tipo User. Solo que en un caso usas la subclase y en el otro la super-clase
No podría quedarme mas claro la programación orientada a objetos con tremenda profesora
se torna interesante el proyecto
Si heredo de una clase abstracta y esa clase tiene métodos abstractos obligatoriamente debo invocar esos metodos en la clase que esta heredando de la abstracta.
Ahora, una clase abstracta puede tener subclases y estas subclases también pueden ser abstractas.
Si tenemos un método abstracto, obligatoriamente su clase debemos colocarla como abstracta.
En resumen, las clases abstractas son útiles cuando quieres definir un comportamiento común para varias clases relacionadas, pero no quieres crear una clase concreta para ese comportamiento.
De hecho según lo que mencionas, si estarías creando una clase, la abstracta
Clase Abstracta =
*No se pueden generar instancias
*Tiene métodos abstractos que son obligatorios de sobrescribir.
*Tiene métodos no abstracto que no son obligatorios de sobrescribir
Interface =
*Tiene métodos que son obligatorios de sobrescribir
Gracias, muy valioso el resumen
Entonces en que casos puedo aplicar una interface??
Hola @Gbarrezueta, normalmente las interface se utilizan cuando quieres que una clase tenga unos atributos o métodos especifico y sea aplicado en la misma obligatoriamente
Lo que entendí:
Las Clases abstractas, son como clases normales (puedes hacer todo lo de una clase normal, como Heredar de ella, definir atributos y métodos.) pero con habilidades de Interfaces (como definir comportamientos únicamente).
Pero entonces, si esto es cierto. puedo emular lo que hace una Interface, con una clase abstracta no? xD
Le pregunte esto a chat gpt, Esta en lo correcto:
Si por ejemplo en le paradiggma de programacion orietado a objetos con el leguaje de programación Java yo tengon una clase padre y la implemeto multiples interfaces los metodos de las intefaces se herdaran a la clase hija?
Respondio:
En Java, una clase puede implementar múltiples interfaces, lo que significa que puede declarar que implementa varias interfaces y proporcionar la implementación de los métodos definidos en esas interfaces. Sin embargo, las interfaces en Java no se heredan como las clases padre.
Cuando una clase implementa una interfaz en Java, está obligada a proporcionar una implementación para todos los métodos definidos en esa interfaz. Estos métodos implementados se vuelven parte de la clase que los implementa y están disponibles para ser invocados en instancias de esa clase. Sin embargo, la implementación de una interfaz en una clase no afecta a la herencia de clases padre.
Esto significa que los métodos de una interfaz implementada en una clase no se heredarán automáticamente a las clases hijas de esa clase. Si una clase hija desea utilizar la implementación de una interfaz proporcionada por su clase padre, debe implementar esa interfaz nuevamente en la clase hija y proporcionar su propia implementación de los métodos definidos en esa interfaz.
Cree un objeto de la clase Columna con datos fijos. Indique como nombre:
[oCol]_[Apellido]
Ejemplo:
oCol_Alva
Una pregunta, se puede sobreescribir metodos abstractos?
Si, como tal como ya no le pones comportamiento al método abstracto necesitas sobre-escribirlo para que la clase hija sea la que lo implemente.
¿Una clase puede componerse de varias clases abstractas como en el caso de interfaces, o solo puede tener un padre como en la herencia?
En cada clase sólo puede extender una clase padre, por el contrario, cómo comentas, puedes implementar cuantas Interfaces quieras
Hay algo que no me queda claro con las clases abstractas, en la clase User ya se definió como abstracta sino que al final de esa clase abstracta aparece como una especie función ¿A qué se refiere con eso?
Hola, lo que aparece al final de la clase es un método abstracto el cual se caracteriza por no tener cuerpo, es decir, no tiene código dentro. Este nos sirve cuando cada clase hija lo implementara de manera distinta, entonces no tiene caso escribir codigo dentro de un metodo el cual sera cambiado por completo en cada clase hija, nos sirve mas que nada como anotaciones de los metodos que heredamos pero que adaptaremos al comportamiento de cada clase
a diferecia de los metodos no abstractos que el codigo de estos s i nos servira para todas las clases como es el ejemplo del metodo ToString.
Hola comunidad, ¿La diferencia entre implementar una interfaz y heredar una clase abstracta, es que la clase abstracta posee métodos opcionales que no son necesarios declararlos?
Así es, aunque otra diferencia interesante es que, en las clases abstractas, podés declarar atributos, mientras que en las interfaces sólo podés declarar constantes y firmas de los métodos.
Otra ventaja de las clases abstactas por sobre herencia por ejemplo, es que en herencia estás "atado" a todas las firmas de los métodos que fueron declarados en la clase padre, mientras que en clases abstactas sólo tendrás que redefinir los métodos que hayas considerado como abstactos en tu modelo de negocio.
Woow, hace bastante tiempo me aleje de la programación precisamente por que las clases abstractas me volaron la cabeza. Ahora quiero agradecer a Anahí por que en solo 12 minutos me explico lo que en 1 semestre no pudieron. <3
Es una tema complejo
Los metodos abstractos pueden tener una implementacion por defecto?, que en dado caso de ser necesario pueda ser sobrescrito en otra clase, digo porque veo que con las clases abstractas puediera definir comportamientos habituales del proyecto y si es necesario cambiarlo para una clase en particular, lo malo es que me limita las clases que puedo heredar que en ese caso serian mejor las interfaces.
¿Si Userr es abstracto ya no son necesarios los gettes and setters?