Clase abstracta

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 16 de mayo de 2020; las comprobaciones requieren 12 ediciones .

Una clase abstracta en la programación orientada a objetos es una clase base que no requiere instanciación. Las clases abstractas implementan en la práctica uno de los principios del polimorfismo OOP . Una clase abstracta puede contener o no [1] ) métodos y propiedades abstractos . Un método abstracto no se implementa para la clase en la que se declara, pero debe implementarse para sus descendientes no abstractos. Las clases abstractas son las abstracciones más generales , es decir, las que tienen el mayor volumen y el menor contenido .

En algunos lenguajes está prohibido crear instancias de clases abstractas, en otros está permitido (por ejemplo, Delphi), pero acceder al método abstracto de un objeto de esta clase durante la ejecución del programa resultará en un error. En muchos lenguajes, es aceptable declarar abstracta cualquier clase, incluso si no tiene métodos abstractos (por ejemplo, Java), precisamente para prohibir la creación de instancias. Se puede pensar en una clase abstracta como una interfaz para la familia de clases de la que deriva, pero a diferencia de una interfaz clásica, una clase abstracta puede tener ciertos métodos además de propiedades.

Los métodos abstractos son siempre virtuales , sin embargo, "abstracto" y "virtual" son conceptos diferentes.

Ejemplos

Delfos

En Delphi , se puede declarar una clase abstracta con métodos abstractos:

TAbstractClass = procedimiento de clase NonAbstractProcedure ; procedimiento ProcedimientoAbstracto ; abstracto ; fin ;

Se puede crear un objeto para dicha clase, pero llamar a un método en AbstractProcedureese objeto en tiempo de ejecución provocará un error.

En versiones recientes de Delphi, la clase en sí también puede declararse abstracta:

TAbstractClass = clase procedimiento abstracto SomeProcedure ; fin ;

Aunque un método SomeProcedurepuede no ser abstracto e implementarse dentro de esa clase, es ilegal crear objetos de la clase declarada de esta manera.

C++

En C++ , se declara que una clase abstracta contiene al menos una función virtual pura , de tipo virtual _сигнатура_функции_ =0;, que, como otras, puede ser reemplazada. Ejemplo en lenguaje de programación C++:

#incluir <iostream> class CA { // Clase abstracta public : CA ( void ) { std :: cout << "Este objeto de la clase" ; } vacío virtual Abstr ( vacío ) = 0 ; // Función virtual pura (vacía). void fun ( void ) { std :: cout << "¡La implementación no se heredará!" ; } ~ CA () { std :: cout << "." << estándar :: endl ; } // Llamado en arr. orden de constructores }; clase CB : CA pública { público : CB ( vacío ) { std :: cout << "CB;" ; } void Abstr ( void ){ std :: cout << " llamar a la función cb.Abstr();" ; } // Función de reemplazo. void fun ( void ){ std :: cout << " función de llamada cb.fun()" ; } ~ CB () {} // No es cierto para abstr. clase ~CB(){ ~CA(); } }; clase CC : CA pública { público : CC ( vacío ) { std :: cout << "CC;" ; } void Abstr ( void ) { std :: cout << " llamar a la función cc.Abstr();" ; } // Función de reemplazo. void fun ( void ) { std :: cout << " función de llamada cc.fun()" ; } ~ CC () {} // No es cierto para abstr. clase ~CC(){ ~CA(); } }; int principal () { std :: cout << "Programa:" << std :: endl ; CB cb ; cb _ resumen (); cb _ diversión (); cb _ ~ CB (); CCcc ; _ cc _ resumen (); cc _ diversión (); cc _ ~ cc (); devolver 0 ; }

El resultado del programa:

Programa: Este objeto de la clase CB; llamar a la función cb.abstr(); llamar a la función cb.fun(). Este objeto de la clase CC; llamar a la función cc.abstr(); llamar a la función cc.fun(). . .

C#

El modificador abstracto indica que la clase solo se puede usar como clase base para la herencia. Las clases abstractas pueden contener accesos y métodos abstractos. No se puede crear una instancia de una clase abstracta llamando a un constructor, pero una instancia de una clase abstracta se crea implícitamente cuando se construye una instancia de una clase concreta derivada. Una clase no abstracta que se deriva de una clase abstracta debe contener las implementaciones reales de todos los accesores y métodos abstractos heredados. Para indicar que no hay implementación en un método o propiedad, use el modificador abstracto en la declaración del método o propiedad. Un método abstracto es un método virtual implícito. Las declaraciones de miembros abstractos (métodos, propiedades, eventos) solo se permiten en clases e interfaces abstractas (estereotipos que son análogos a las clases abstractas puras en las que está prohibida cualquier implementación). Dado que una declaración de método abstracto no proporciona una implementación real, no hay cuerpo de método, la declaración de método simplemente termina con un punto y coma, similar a las declaraciones de prototipo:

public abstract void AbstractMethod ();

La implementación la proporciona el método override, que es miembro de la clase no abstracta.

El uso de modificadores estáticos o virtuales en un método abstracto o declaración de propiedad es ilegal. Las propiedades abstractas funcionan de la misma manera que los métodos abstractos, excepto por las diferencias en la sintaxis de declaración y llamada. Una propiedad heredada abstracta se puede anular en una clase derivada al incluir una declaración de propiedad que use un modificador de anulación.

clase abstracta BaseClass // Clase abstracta { protected int _x = 100 ; int protegido _y = 150 ; public abstract void AbstractMethod (); // Método abstracto public abstract int X { get ; } public abstract int Y { get ; } } class DerivedClass : BaseClass { public override void AbstractMethod () { _x ++; _y ++; } public override int X // propiedad anulada { get { return _x + 10 ; } } public override int Y // propiedad anulada { get { return _y + 10 ; } } static void Principal () { Clase Derivada o = nueva Clase Derivada (); o . método abstracto (); consola _ WriteLine ( "x = {0}, y = {1}" , o . X , o . Y ); } } // Salida: x = 111, y = 161

Una clase abstracta debe proporcionar una implementación para todos los miembros de una interfaz. Una clase abstracta que implementa una interfaz puede asignar métodos de interfaz a métodos abstractos.

interfaz I { void M (); } clase abstracta C : I { public abstract void M (); }

No se puede utilizar una clase abstracta con el modificador sellado porque los modificadores abstracto y sellado tienen significados que se excluyen mutuamente. El modificador sellado evita que la clase se herede, mientras que el modificador abstracto especifica que la clase debe tener clases derivadas.

Notas

  1. Clases y métodos abstractos (Los tutoriales de Java™ > Aprendiendo el lenguaje Java > Interfaces y herencia) . Fecha de acceso: 30 de septiembre de 2010. Archivado desde el original el 2 de agosto de 2010.

Véase también

Literatura

  • Podbelsky VV Capítulo 10.3 Funciones virtuales y clases abstractas \\ Clases abstractas. // lenguaje C++ / rec. Dadaev Yu. G. - 4. - M. : Finanzas y estadísticas , 2003. - P. 365-373. — 560 págs. - ISBN 5-279-02204-7 , UDC 004.438Si (075.8) LBC 32.973.26-018 1ya173.