En los lenguajes de programación , un tipo abstracto es un tipo en un sistema de tipo nominativo que no se puede instanciar directamente; un tipo que no es abstracto, que puede instanciarse, se denomina tipo concreto . Cada instancia de un tipo abstracto es una instancia de algún subtipo concreto . Los tipos abstractos también se conocen como tipos existenciales . [1]
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 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 , combinaciones , sabores , roles o clases de tipos . [ cita requerida ]
Significando tipos abstractos
Las clases abstractas se pueden crear, significar o simular de varias formas:
- Mediante el uso de la palabra clave explícita resumenen la definición de clase, como en Java , D o C # .
- Incluyendo, en la definición de la clase, uno o más métodos abstractos (llamados funciones virtuales puras en C ++ ), que se declara que la clase acepta como parte de su protocolo, pero para los cuales no se proporciona ninguna implementación.
- Por heredar de un tipo abstracto, y no anulando todas las características que faltan necesarias para completar la definición de clase. En otras palabras, un tipo hijo que no implementa todos los métodos abstractos de su padre se convierte en abstracto. [2] [3]
- En muchos lenguajes tipados dinámicamente como Smalltalk , cualquier clase que envíe un método particular a esto , pero no implemente ese método, puede considerarse abstracta. (Sin embargo, en muchos de estos lenguajes, como Objective-C , el error no se detecta hasta que se usa la clase, y el mensaje devuelve resultados en un mensaje de error de excepción como "No reconoce el selector: xxx" como
- [NSObject doesNotRecognizeSelector:(SEL)selector]
se invoca al detectar un método no implementado).
Ejemplo (Java)
// Por defecto, todos los métodos en todas las clases son concretos, a menos que se use la palabra clave abstracta. abstract class Demo { // Una clase abstracta puede incluir métodos abstractos, que no tienen implementación. resumen public int suma ( int x , int y ); // Una clase abstracta también puede incluir métodos concretos. public int product ( int x , int y ) { return x * y ; } }// Por defecto, todos los métodos en todas las interfaces son abstractos, a menos que se utilice la palabra clave por defecto. interfaz DemoInterface { [ resumen ] int getLength (); // Resumen se puede utilizar 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 ; } }
Uso de tipos abstractos
Los tipos abstractos son una característica importante en los lenguajes de programación orientada a objetos de tipo estático . Muchos lenguajes tecleados dinámicamente no tienen una característica equivalente (aunque el uso de tipado pato hace que los tipos abstractos sean innecesarios); sin embargo, los rasgos se encuentran en algunos lenguajes modernos de tipado dinámico. [ cita requerida ]
Algunos autores sostienen que las clases deberían ser clases hoja (no tener subtipos), o bien ser abstractas. [4] [5]
Los tipos abstractos son útiles porque pueden usarse para definir y hacer cumplir un protocolo ; un conjunto de operaciones que deben soportar todos los objetos que implementan el protocolo. [ cita requerida ]
Los tipos abstractos también son una parte esencial del patrón de método de plantilla .
Ver también
Referencias
- ^ Mitchell, John C .; Plotkin, Gordon D .; Los tipos abstractos tienen tipo existencial , transacciones ACM en lenguajes y sistemas de programación, vol. 10, núm. 3, julio de 1988, págs. 470–502
- ^ a b "Clases y métodos abstractos (Tutoriales de Java ™> Aprendizaje del lenguaje Java> Interfaces y herencia)" . Oracle.com . Consultado el 14 de agosto de 2019 .
- ^ "Funciones virtuales puras y clases abstractas en C ++" . GeeksforGeeks.org .
- ^ Riel, Arthur (1996). Heurística de diseño orientado a objetos . Addison-Wesley Professional. pag. 89. ISBN 0-201-63385-X.
- ^ Meyers, Scott (1996). C ++ más eficaz . Addison-Wesley Professional. pag. 258 . ISBN 0-201-63371-X.
Hacer abstractas las clases que no son hojas
Otras lecturas
- Head First Java . O'Reilly Media. 2003. págs. 688 . ISBN 0-596-00920-8.
- Core Java: un enfoque integrado por R. Nageswara Rao
enlaces externos
- "Explicación de las interfaces abstractas o esqueléticas" [1]
- Tipos y lenguajes de programación por Benjamin Pierce (MIT Press 2002) [2]
- Tipo de resumen en el código Rosetta