Articulo de referencia

Tipo abstracto

En los lenguajes de programación , un tipo abstracto (también conocido como tipo existencial ) [ 1 ] es un tipo en un sistema de tipos nominativo que no puede instanciarse direc...

En los lenguajes de programación , un tipo abstracto (también conocido como tipo existencial ) [ 1 ] es un tipo en un sistema de tipos nominativo que no puede instanciarse directamente; por el contrario, un tipo concreto puede instanciarse 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 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 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 .

Los tipos abstractos también pueden incluir cualquier número de métodos y propiedades no abstractos, como cuando se implementa el patrón Método Plantilla , que utiliza una mezcla de métodos invariantes con implementaciones fijas y métodos de enlace que pueden ser sobrescritos en subclases concretas para proporcionar lógica personalizada.

Creación

Las clases abstractas pueden crearse, representarse o simularse de varias maneras:

  • Mediante el uso de la palabra claveabstract explícita en la definición de la clase, como en Java , D o C# .
  • Al incluir, en la definición de la clase, uno o más métodos abstractos (llamados funciones virtuales puras en C++ ), que la clase declara aceptar como parte de su protocolo, pero para los cuales no se proporciona ninguna implementación.
  • Al heredar de un tipo abstracto y no sobrescribir todas las características faltantes necesarias para completar la definición de la clase. En otras palabras, un tipo hijo que no implementa todos los métodos abstractos de su padre se vuelve abstracto a su vez. [ 2 ] [ 3 ]
  • En muchos lenguajes de tipado dinámico como Smalltalk , cualquier clase que pasa un método específico a `this` , pero que no implementa dicho método, puede considerarse abstracta. (Sin embargo, en muchos lenguajes de este tipo, como Objective-C , el error no se detecta hasta que se utiliza la clase, y el mensaje devuelto resulta en un mensaje de error de excepción como "No reconoce el selector: xxx", que - [NSObject doesNotRecognizeSelector:(SEL)selector]se invoca al detectar un método no implementado).

Ejemplos

Java

Por defecto, 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. Por defecto, todos los métodos de todas las interfaces son abstractos, a menos que se utilice la palabra clave `default`. Esta palabra clave permite especificar un método concreto en una interfaz.

// Por defecto, todos los métodos en todas las clases son concretos, a menos que se utilice la palabra clave abstract. 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 ; } }// Por defecto, todos los métodos en todas las interfaces son abstractos, a menos que se utilice la palabra clave default. interface DemoInterface { int getLength (); // La palabra clave abstract se puede usar aquí, aunque es completamente inútil // La palabra clave default 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

Los tipos abstractos son una característica importante en los lenguajes de programación orientada a objetos con tipado estático . Muchos lenguajes con tipado dinámico no tienen una característica equivalente (aunque el uso del tipado dinámico hace innecesarios los tipos abstractos); sin embargo, en algunos lenguajes modernos con tipado dinámico se encuentran rasgos .

Algunos autores argumentan 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 todos los objetos que implementan el protocolo deben admitir.

Los tipos abstractos también son una parte esencial del patrón de método de plantilla .

Véase también

Referencias

  1. Mitchell, John C.; Plotkin, Gordon D.; Los tipos abstractos tienen tipo existencial , ACM Transactions on Programming Languages ​​and Systems, vol. 10, n.º 3, julio de 1988, págs. 470–502
  2. 1 2 "Métodos y clases abstractas (Tutoriales de Java > Aprendiendo el lenguaje Java > Interfaces y herencia)" . Oracle.com . Consultado el 14 de agosto de 2019 .
  3. "Funciones virtuales puras y clases abstractas en C++" . GeeksforGeeks.org . 15 de julio de 2014.
  4. Riel, Arthur (1996). Heurísticas de diseño orientado a objetos . Addison-Wesley Professional. pág. 89. ISBN  0-201-63385-X.
  5. Meyers, Scott (1996). More Effective C++ . Addison-Wesley Professional. pág . 258. ISBN  0-201-63371-X. Hacer que las clases que no son hojas sean abstractas

Lecturas adicionales

  • Head First Java . O'Reilly Media. 2003. 688 páginas. ISBN  0-596-00920-8.
  • Java básico: Un enfoque integrado por R. Nageswara Rao
  • "Interfaces abstractas o esqueléticas explicadas"
  • Tipos de datos y lenguajes de programación, de Benjamin Pierce (MIT Press, 2002)
  • Tipo abstracto en Rosetta Code