En los lenguajes de programación , un tipo abstracto (también conocido como tipo existencial ) [1] es un tipo en un sistema de tipos nominativos que no se puede instanciar directamente; por el contrario, un tipo concreto se puede instanciar directamente. La instanciación de un tipo abstracto solo puede ocurrir indirectamente, a través de un subtipo concreto .
Un tipo abstracto puede no proporcionar 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 la 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 que se pueden instanciar. 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 requerida ]
Los tipos abstractos también pueden incluir cualquier número de métodos y propiedades no abstractos, como cuando se implementa el Patrón de método de plantilla que utiliza una mezcla 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 manera predeterminada, todos los métodos de todas las clases son concretos, a menos que se utilice la palabra clave abstract. Una clase abstracta puede incluir métodos abstractos, que no tienen implementación. De manera predeterminada, todos los métodos de todas las interfaces son abstractos, a menos que se utilice la palabra clave default. La palabra clave default se puede utilizar para especificar un método concreto en una interfaz.
//De forma predeterminada, todos los métodos en todas las clases son concretos, a menos que se use la palabra clave abstracta. public abstract class Demo { // Una clase abstracta puede incluir métodos abstractos, que no tienen implementación. public abstract int sum ( int x , int y ); // Una clase abstracta también puede incluir métodos concretos. public int product ( int x , int y ) { return x * y ; } } //De manera predeterminada, todos los métodos en todas las interfaces son abstractos, a menos que se use la palabra clave predeterminada. interface 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 tipado estático . Muchos lenguajes de tipado dinámico no tienen una característica equivalente (aunque el uso de tipado dinámico hace innecesarios los tipos abstractos); sin embargo, se encuentran rasgos en algunos lenguajes de tipado dinámico modernos. [ cita requerida ]
Algunos autores argumentan que las clases deberían ser clases hoja (no tener subtipos) o, de lo contrario, 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 requerida ]
Los tipos abstractos también son una parte esencial del patrón de método de plantilla .
las clases que no son hojas