A veces NO necesitamos implementar todos los métodos de una clase heredada o interfaz. No siempre necesitamos crear instancias o implementar todos los métodos heredados de una clase padre, así como tampoco podremos necesitamos algún método de nuestras interfaces, pero estas nos obligan a escribir el código de todos los métodos que definimos genéricamente.
Afortunadamente, las Clases Abstractas resuelven todos estos problemas. Son una combinación entre interfaces y herencia donde no implementaremos todos los métodos ni tampoco crearemos instancias.
Interface: te obliga a implementar todos los métodos.
Herencia: A veces no necesitamos crear instancias de una clase padre, porque es muy genérica.
Clases Abstractas: Combinación entre Interface y Herencia , no implementa todos los métodos, por su composición no es necesario instanciarlo, no se pueden crear instancias de una clase abstracta.
Pero las clases que deriben de la clase abstracta tendran que implementar todos los metodos de la interfaz (por lo cual no sirve demasiado para ese fin)
Sirve para el de las clases abstractas que se vio en el anterior curso de POO
claro las clases abstractas solo es una plantilla de lo que debes hacer mas no el código casi igual de la interface pero menos estricta
La herencia desprende, entre algunos, dos conceptos particulares, que son las CLASES ABTRACTAS y las INTERFACES.
Las CLASES ABSTRACTAS son aquellas clases que tienen por lo menos un método abstracto, es decir, un método no definido. Y además no pueden ser instanciadas, únicamente pueden ser heredadas (extends). Para definir una clase abstracta usamos:
abstract classEjemplo{//código}
Las INTERFACES son siempre una clase abstracta pública, tanto así, que todos sus métodos son abstractos públicos implícitamente, es decir, no necesitamos usar las palabras reservadas public abstract al momento de declararlos.
Las INTERFACES tampoco pueden ser instanciadas, únicamente pueden ser implementadas (implements).
Y únicamente pueden contener constantes públicas.
Para definir una INTERFAZ usamos:
interfaceEjemplo{//constantes y/o métodos }
Gracias Raul , eres genial
Genial estas definiciones, muchas gracias.
✨ No podemos instanciarobjetos de una clase abstracta.
Clases Abstractas
Uno de los puntos débiles de la implementación de interfaces es que a veces no necesitamos implementar todos los métodos que contiene la interfaz o la clase padre.
En el caso de la herencia, las clases podrían no necesitar heredar la implementación o el comportamiento de un método. A veces no necesitamos crear instancias de una clase padre, ya que es muy genérica.
Estos problemas vienen a ser solucionados por las Clases Abstracta, estas clases se podrían definir como una combinación entre interfaces y herencia de clases. Con las clases abstractas no es necesario implementar todos lo métodos y tampoco es necesario crear instancias/objetos de estas clases (de hecho no es posible crear objetos de una clase abstracta).
En este caso la clase Triangulo está heredando de la clase Figura, pero también podría ser una clase Circulo, Cuadrado u otra figura. En esta clase se definirían los elementos más definidos posibles y con esto ya no es necesario crear una instancia de la clase Figura.
Si en nuestro programa, hacemos la clase User una clase abstracta no aparecería ningún error, ya que esta clase no tiene ninguna instancia creada, solo sirve para heredarle a las demás clases los atributos y métodos. Cabe mencionar que sí se pueden crear instancias de las clases que heredan de User.
Si yo tengo por ejemplo:
User usuario =newDoctor("Cardiologia","pepe","a@a.com");
Seria un ejemplo de poliformismo?. Y cuando yo emplee user como abstracta, que me cambiaría ahí? o en que me beneficia?
Buenas! efectivamente y como dices eso sería un ejemplo de polimorfismo, la ventaja que tiene usar esto, y tambien herencia, es que te permite el reusar código de manera fácil y por tanto te ahorra trabajo, es importante que esto quede definido en la fase de diseño, pues requiere de entender bien como funciona la herencia y el polimorfismo para usarlo, pero ciertamente hacer que el código trabaje mas eficientemente por ti, después hare un ejemplo en codigo para que entiendas mejor!
Una clase abstracta es una combinación entre una interfaz y herencia
De una clase abstracta no se implementa todos los métodos, podemos decidir que metodos debemos y no debemos implementar.
No se crean instancias, no se crean objetos de una clase abstracta.
No se pueden crear instancias de una clase abstracta pero se puede crear objetos de una clase abstracta siempre y cuando el objeto se instancie como objeto de una clase hija de la super clase abstracta
ejemplo:
User user =newUser();// => Esto no se puede hacer poque la clase User es abstracta.User user =newDoctor();// => Esto si se puede hacer porque estamos creando un objeto de tipo User pero le estamos diciendo que se comporte como un objeto de tipo Doctor, le estamos llamando al constructor de la clase Doctor y le estamos dando un comportamiento al objeto User.
La pendiente cada vez más inclinada
Mmm, ¿Cómo?
Que cada vez está más difícil.
Me quedo muy claro !!
Es como un nino pequeno:
.
Que quiero pizza, ay! pero sin cebolla, ay! que tampoco me gusta la rugula. quiero que traiga mucho mas queso y pimienta
.
Esta bien, toma tu Pizza abstracta 😛
¿Cuándo se instancia la clase padre? No entendí esa parte. Además me perdí porque veo que en el ciclo for antes de la clase Doctor se pone model
Hola Nacho
No necesitas instanciar la clase padre, porque luego tendrás una clase hija que heredará métodos y atributos de la clase padre.
De todas formas, al ser una clase, sí se puede instanciar, pero uno no suele hacer eso.
Si creo la clase "Electrodoméstico" para luego crear las clases "Lavadora" "Juguera" y "Aspiradora" donde estas 3 heredarán todo de Electrodoméstico... ¿para qué necesitas instanciar Electrodoméstico? No lo necesitas.
muy buena respuesta la de pato me ayudo a entender todo
this.speciality = speciality; eso en que parte del curso lo arregla?
Genial genial geniaaal!!
EJERCICIO (hallar área de figuras):
//CLASE ABSTRACTA BASE:
(SOLAMENTE USANDO UN MÉTODO ABSTRACTO,LOS DEMÁS SON CONSTRUCTORES QUE PUEDEN SER USADO PARA DIFERENTES OBJETOS)
abstract classfigura{private double base;private double altura;privateString nombre;//Constructor por defectofigura(){ base=altura=0d; nombre ="Nada";}//figura normalfigura(String n , double b , double h){this.nombre=n;this.base=b;this.altura=h;}//figura tiene la misma base y alturafigura(Double x ,String nombre){ base = altura = x;this.nombre= nombre;}// CREANDO UN OBJETO A PARTIR DE UN OBJETOfigura(figura object){ altura = object.altura; base = object.base; nombre = object.nombre;}//MÉTODO ASBTRACTO abstract double area();//métodos get y setpublic double getBase(){return base;}publicvoidsetBase(double base){this.base= base;}public double getAltura(){return altura;}publicvoidsetAltura(){this.altura= altura;}publicStringgetNombre(){return nombre;}publicvoidsetNombre(String nombre){this.nombre= nombre;}}
//CLASE TRIÁNGULOSpublicclasstrianguloextendsfigura{privateString tipo;triangulo(figura objeto1){super(); tipo ="nullo";System.out.println(tipo);System.out.println("El área es: "+area());}triangulo(double b , double h,String t){super("Triangulo", b, h);this.tipo=t;System.out.println(tipo);System.out.println(getNombre());System.out.println("El área es: "+area());}//Triangulo EQUILATERO (LADOS IGUALES)triangulo(double x ,String t){super(x,"Triángulo");this.tipo=t;System.out.println(tipo);System.out.println(getNombre());System.out.println("El área es: "+area());System.out.println(getNombre());}//OBJETO A PARTIR DE UN OBJETOtriangulo(triangulo obj){//Pasa el objeto al constructor de DosDimensionessuper(obj);System.out.println("El área es: "+area());System.out.println(getNombre());} @Override double area(){return(getBase()*getAltura())/2;}}
//CLASE RECTÁNGULO
publicclassrectángulo extendsfigura{rectángulo(){}rectángulo(double b , double h){super("Rectángulo", b,h);System.out.println("El área es: "+area());}rectángulo(double x){super(x,"Cuadrado");System.out.println("El área es: "+area());System.out.println(getNombre());} @Override double area(){returngetBase()*getAltura();}}
//MAIN PRINCIPAL
publicclassmain{publicstaticvoidmain(String[] args){ figura objeto1=newtriangulo(6,"EQUILÁTERO");System.out.println("------------------------------------"); figura objeto2 =newtriangulo(12.4,8.9,"ESCALENO");System.out.println("------------------------------------"); figura objeto3 =newrectángulo(12d);}}
Mis apuntes de esta Clase:
Clases Abstractas
El polimorfismo se puede aplicar en la herencia sobrescribiendo métodos. n el caso de la implementación de Interfaces también se aplica el polimorfismo.
Cuando se implementa una Interfaz sobre una Clase es necesario que dicha Clase implemente todos los métodos de la Interfaz. No obstante hay casos en los que hacer esto es no necesario y sólo no se ocupa implementar todos los métodos de una interfaz.
En el caso la Herencia, cuando se sobrescribe un método, este hereda la implementación que tenía en la superclase, pero en ocasiones no se necesita heredar la implementación de un método. Otra situación que se puede presentar en la herencia es que no se quiere crear una instancia de una Clase padre ya que esta es muy genérica.
Las Clases abstractas permiten solucionar los problemas citados anteriormente. Las Clases abstractas son una especie de combinación entre Interfaces y Herencia. En este tipo de Clases se puede definir que tipo de métodos son obligatorios de implementar y cuáles no y además no se crean instancias.
// Declarar una Clase abstractapublicabstractclassFigura{// Implementación}// Usar una Clase abstractaclassTrianguloextendsFigura{// Implementación}
Cuando no necesitamos implementar todos los métodos de una Interface (cosa que estamos obligados a hacer si implementamos una Interface) y tampoco necesitamos crear instancias de una clase padre porque es muy genérica podemos utilizar Clases Abstractas para solucionar dicho problema.
Una Clase Abstracta es una clase cualquiera, pero que no puede ser instanciada, solo heredada.
Entendí que usarás clases abstractas cuando NO quieras usarlas. Por ejemplo nunca harás una clase figura como tal, siempre será una clase cuadrado o triángulo.
Práctica
Recuerden muchachos. Para interiorizar estos conceptos tenemos que practicar. Aquí les dejo un ejercicio:
.
Jerarquía de Formas: Crea una clase abstracta llamada Forma con métodos abstractos como calcularÁrea() y calcularPerímetro(). Luego, crea subclases concretas como Círculo, Rectángulo y Triángulo que extiendan Forma e implementen estos métodos. Prueba la implementación creando instancias de cada forma y llamando a sus métodos.
No entendi muy bien el beneficio de por que es bueno usar el "abstract", ya que siento que dejarlo asi tambien estaria bien, alguien podria decirme de que realmente funciona abstract???
Las clases abstractas en general, son una especie de contrato (algo así como las interfaces) que menciona que, cualquier clase que herede de esta clase abstracta debe implementar sí o sí dicho método, es decir, no lo pueden omitir, digamos que es una especie de obligación :D
Si una clase abstracta implementa una interfaz con 2 metodos, y uno de ellos se ocupa, despues POR QUE la clase hija debe implementar el otro metodo?
no se supone que no se implementaran todos los metodos?
No entiendo como una clase abstracta no pueden instanciarse pero si se le funciona el constructor cuando se usa "super" desde el constructor de una clase hija.
Porque en la clase hija se especifica que se va a heredar de la clase abstracta y pues para poder usar la herencia en el nuevo hijo. Es necesario usar el constructor del padre, el cual lo llamamos con Super