En los lenguajes de programación , un tipo abstracto (también conocido como tipos existenciales ) [1] es un tipo en un sistema de tipos nominativos del que no se puede crear una instancia directamente; por el contrario, se puede crear una instancia de un tipo concreto directamente. La creación de instancias de un tipo abstracto sólo puede ocurrir indirectamente, a través de un subtipo concreto .
Un tipo abstracto puede no proporcionar ninguna implementación o una implementación incompleta. En algunos lenguajes, los tipos abstractos sin implementación (en lugar de una implementación incompleta) se conocen como protocolos , interfaces , firmas o tipos de clase . En la programación orientada a objetos basada en clases , los tipos abstractos se implementan como clases abstractas (también conocidas como clases base abstractas ) y los tipos concretos como clases concretas . En programación genérica , la noción análoga es un concepto , que especifica de manera similar la sintaxis y la semántica, pero no requiere una relación de subtipo: dos tipos no relacionados pueden satisfacer el mismo concepto.
A menudo, los tipos abstractos tendrán una o más implementaciones proporcionadas por separado, por ejemplo, en forma de subtipos concretos de los que se pueden crear instancias. En la programación orientada a objetos, una clase abstracta puede incluir métodos abstractos o propiedades abstractas [2] que son compartidas por sus subclases. Otros nombres para las características del lenguaje que se usan (o pueden usarse) para implementar tipos abstractos incluyen rasgos , mixins , sabores , roles o clases de tipos . [ cita necesaria ]
Los tipos abstractos también pueden incluir cualquier cantidad de métodos y propiedades no abstractos, como cuando se implementa el patrón de método de plantilla , que utiliza una combinación de métodos invariantes con implementaciones fijas y métodos de enlace que se pueden anular en subclases concretas para proporcionar una lógica personalizada.
Las clases abstractas se pueden crear, significar o simular de varias maneras:
abstract
explícita en la definición de clase, como en Java , D o C# .- [NSObject doesNotRecognizeSelector:(SEL)selector]
se invoca al detectar un método no implementado).De forma predeterminada, todos los métodos de todas las clases son concretos, a menos que se utilice la palabra clave abstracta. Una clase abstracta puede incluir métodos abstractos que no tienen implementación. De forma predeterminada, todos los métodos en todas las interfaces son abstractos, a menos que se utilice la palabra clave predeterminada. La palabra clave predeterminada se puede utilizar para especificar un método concreto en una interfaz.
// De forma predeterminada, todos los métodos de todas las clases son concretos, a menos que se utilice la palabra clave abstracta. public abstract class Demo { // Una clase abstracta puede incluir métodos abstractos, que no tienen implementación. resumen público int suma ( int x , int y ); // Una clase abstracta también puede incluir métodos concretos. público int producto ( int x , int y ) { return x * y ; } } // De forma predeterminada, todos los métodos en todas las interfaces son abstractos, a menos que se utilice la palabra clave predeterminada. interfaz DemoInterface { int getLength (); //La palabra clave abstracta se puede usar aquí, aunque es completamente inútil //La palabra clave predeterminada se puede usar en este contexto para especificar un método concreto en una interfaz default int product ( int x , int y ) { return x * y ; } }
Los tipos abstractos son una característica importante en los lenguajes OOP de tipo estático . Muchos lenguajes de tipado dinámico no tienen una característica equivalente (aunque el uso de tipeo pato hace que los tipos abstractos sean innecesarios); sin embargo, se encuentran rasgos en algunos lenguajes modernos de tipado dinámico. [ cita necesaria ]
Algunos autores sostienen que las clases deberían ser clases hoja (no tener subtipos) o ser abstractas. [4] [5]
Los tipos abstractos son útiles porque se pueden utilizar para definir y aplicar un protocolo ; un conjunto de operaciones que todos los objetos que implementan el protocolo deben soportar. [ cita necesaria ]
Los tipos abstractos también son una parte esencial del patrón de método de plantilla .
Hacer que las clases que no son hojas sean abstractas