En la programación orientada a objetos (POO), un método es un procedimiento asociado a un objeto y, generalmente, también a un mensaje . Un objeto consta de datos de estado y comportamiento ; estos componen una interfaz , que especifica cómo se puede utilizar el objeto. Un método es un comportamiento de un objeto parametrizado por un usuario.
Los datos se representan como propiedades del objeto, y los comportamientos como métodos. Por ejemplo, un Windowobjeto podría tener métodos como openy close, mientras que su estado (si está abierto o cerrado en un momento dado) sería una propiedad.
En la programación basada en clases , los métodos se definen dentro de una clase , y los objetos son instancias de una clase dada. Una de las capacidades más importantes que proporciona un método es la sobreescritura de métodos : el mismo nombre (por ejemplo, area) se puede usar para varios tipos diferentes de clases. Esto permite que los objetos emisores invoquen comportamientos y deleguen la implementación de esos comportamientos al objeto receptor. Un método en la programación Java establece el comportamiento de un objeto de clase. Por ejemplo, un objeto puede enviar un areamensaje a otro objeto y se invoca la fórmula apropiada, ya sea que el objeto receptor sea un Rectangle, Circle, Triangle, etc.
Los métodos también proporcionan la interfaz que otras clases utilizan para acceder y modificar las propiedades de un objeto; esto se conoce como encapsulación . La encapsulación y la sobreescritura son las dos características distintivas principales entre los métodos y las llamadas a procedimientos. [ 1 ]
Anulación y sobrecarga
La sobreescritura y la sobrecarga de métodos son dos de las diferencias más significativas entre un método y un procedimiento o llamada a función convencional. La sobreescritura se refiere a la redefinición de la implementación de un método de su superclase por parte de una subclase. Por ejemplo, findAreaun método definido en una clase de forma, [ 2 ]Triangle , etc., definiría cada uno la fórmula apropiada para calcular su área. La idea es considerar los objetos como "cajas negras" para que los cambios en su funcionamiento interno tengan un impacto mínimo en los demás objetos que los utilizan. Esto se conoce como encapsulación y tiene como objetivo facilitar el mantenimiento y la reutilización del código.
Por otro lado, la sobrecarga de métodos se refiere a diferenciar el código utilizado para procesar un mensaje según los parámetros del método. Si se considera el objeto receptor como el primer parámetro de cualquier método, entonces la sobreescritura es simplemente un caso especial de sobrecarga, donde la selección se basa únicamente en el primer argumento.
Métodos de acceso, mutación y gestión
Los métodos de acceso se utilizan para leer los valores de datos de un objeto. Los métodos de modificación se utilizan para modificar los datos de un objeto. Los métodos de gestión se utilizan para inicializar y destruir objetos de una clase, por ejemplo, constructores y destructores.
Estos métodos proporcionan una capa de abstracción que facilita la encapsulación y la modularidad . Por ejemplo, si una clase de cuenta bancaria proporciona un getBalance()método de acceso para recuperar el saldo actual (en lugar de acceder directamente a los campos de datos del saldo), las revisiones posteriores del mismo código pueden implementar un mecanismo más complejo para la recuperación del saldo (por ejemplo, una consulta a la base de datos ), sin necesidad de modificar el código dependiente. Los conceptos de encapsulación y modularidad no son exclusivos de la programación orientada a objetos. De hecho, en muchos sentidos, el enfoque orientado a objetos es simplemente la extensión lógica de paradigmas anteriores como los tipos de datos abstractos y la programación estructurada . [ 3 ]
Constructores
Un constructor es un método que se llama al inicio del ciclo de vida de un objeto para crearlo e inicializarlo, un proceso denominado construcción (o instanciación ). La inicialización puede incluir la adquisición de recursos. Los constructores pueden tener parámetros, pero generalmente no devuelven valores en la mayoría de los lenguajes. Vea el siguiente ejemplo en Java:
clase pública Persona { cadena privada nombre ; entero privado edad ;// método constructor public Person ( String name , int age ) { this . name = name ; this . age = age ; } }Incinerador de basuras
Un destructor es un método que se llama automáticamente al final del ciclo de vida de un objeto, un proceso llamado destrucción . En la mayoría de los lenguajes de programación, la destrucción no permite argumentos ni valores de retorno para los métodos destructores. Los destructores pueden implementarse para realizar tareas de limpieza y otras funciones al destruir un objeto.
Finalizadores
En lenguajes con recolección de basura , como Java , [ 4 ] : 26, 29 C# , [ 5 ] : 208–209 y Python , los destructores se conocen como finalizadores . Tienen un propósito y función similares a los destructores, pero debido a las diferencias entre los lenguajes que utilizan recolección de basura y los lenguajes con administración manual de memoria , la secuencia en la que se llaman es diferente.
Métodos abstractos
Un método abstracto es aquel que solo tiene una firma y no un cuerpo de implementación . Se usa frecuentemente para especificar que una subclase debe proporcionar una implementación del método, como en una clase abstracta . Los métodos abstractos se utilizan para especificar interfaces en algunos lenguajes de programación. [ 6 ]
Ejemplo
![]()
El siguiente código Java muestra una clase abstracta que necesita ser extendida:
clase abstracta Shape { // firma del método abstracto abstract int area ( int height , int width ); }La siguiente subclase extiende la clase principal:
public class Rectangle extends Shape { @Override int area ( int height , int width ) { return height * width ; } }Reabstracción
Si una subclase proporciona una implementación para un método abstracto, otra subclase puede volver a hacerlo abstracto. Esto se denomina reabstracción .
En la práctica, esto se usa raramente.
Ejemplo
En C#, un método virtual puede ser sobrescrito por un método abstracto. (Esto también se aplica a Java, donde todos los métodos no privados son virtuales).
clase IA { público virtual void M () { // ... } }clase abstracta IB : IA { // permitido público sobrescribir abstracto void M (); }Los métodos predeterminados de las interfaces también pueden ser reabstraídos, lo que obliga a las subclases a implementarlos. (Esto también se aplica a Java).
interfaz IA { void M () { // ... } }interfaz IB : IA { abstract void IA . M (); }// error: la clase 'C' no implementa 'IA.M'. class C : IB { // ... }Métodos de clase
Los métodos de clase son aquellos que se invocan sobre una clase , no sobre una instancia. Suelen utilizarse como parte de un metamodelo de objetos . Es decir, para cada clase definida, se crea una instancia del objeto de clase en el metamodelo. Los protocolos del metamodelo permiten crear y eliminar clases. En este sentido, ofrecen la misma funcionalidad que los constructores y destructores descritos anteriormente. Sin embargo, en algunos lenguajes, como Common Lisp Object System (CLOS), el metamodelo permite al desarrollador modificar dinámicamente el modelo de objetos en tiempo de ejecución: por ejemplo, para crear nuevas clases, redefinir la jerarquía de clases, modificar propiedades, etc.
Métodos especiales
Los métodos especiales son muy específicos de cada lenguaje de programación, y un lenguaje puede no admitir ninguno, algunos o todos los métodos especiales aquí definidos. El compilador de un lenguaje puede generar automáticamente métodos especiales predeterminados, o bien, el programador puede definirlos opcionalmente. La mayoría de los métodos especiales no se pueden llamar directamente; en su lugar, el compilador genera código para invocarlos en los momentos adecuados.
Métodos estáticos
Los métodos estáticos están diseñados para ser relevantes para todas las instancias de una clase, no para una instancia específica. En ese sentido, son similares a las variables estáticas . Un ejemplo sería un método estático para sumar los valores de todas las variables de cada instancia de una clase. Por ejemplo, si existiera una Productclase, podría tener un método estático para calcular el precio promedio de todos los productos.
Se puede invocar un método estático incluso si aún no existen instancias de la clase. Los métodos estáticos se denominan "estáticos" porque se resuelven en tiempo de compilación en función de la clase sobre la que se invocan, y no de forma dinámica como en el caso de los métodos de instancia, que se resuelven polimórficamente en función del tipo de objeto en tiempo de ejecución.
Ejemplos
En Java
En Java, un método estático de uso común es Math.max().
// llamada como: Math.max ( a , b );// declarado como: public class Math { // ...public static double max ( double a , double b ) { return ( a < b ) ? b : a ; } }Este método estático no tiene objeto propietario y no se ejecuta en una instancia. Recibe toda la información de sus argumentos. [ 2 ]
Operadores de asignación de copias
Los operadores de asignación por copia definen las acciones que debe realizar el compilador cuando se asigna un objeto de una clase a otro objeto de la misma clase.
Métodos del operador
Los métodos de operador definen o redefinen los símbolos de operador y definen las operaciones que se realizarán con el símbolo y los parámetros del método asociado. Ejemplo en C++:
importar std ;usando std :: string ;clase Persona { privado : cadena nombre ; entero edad ; público : bool operador < ( const Persona & otro ) const { return edad < otro.edad ; }bool operator == ( const Person & other ) const { return name == other . name && age == other . age ; } };Funciones miembro en C++
Algunos lenguajes procedimentales se ampliaron con capacidades orientadas a objetos para aprovechar las amplias habilidades y el código heredado de esos lenguajes, pero manteniendo los beneficios del desarrollo orientado a objetos. Quizás el ejemplo más conocido sea C++ , una extensión orientada a objetos del lenguaje de programación C. Debido a los requisitos de diseño para agregar el paradigma orientado a objetos a un lenguaje procedimental existente, el paso de mensajes en C++ tiene algunas capacidades y terminologías únicas. Por ejemplo, en C++ un método se conoce como función miembro . C++ también tiene el concepto de funciones virtuales , que son funciones miembro que se pueden sobrescribir en clases derivadas y permiten el despacho dinámico .
Funciones virtuales
Las funciones virtuales son el medio por el cual una clase de C++ puede lograr un comportamiento polimórfico. Las funciones miembro no virtuales , o métodos regulares , son aquellas que no participan en el polimorfismo .
Ejemplo en C++:
importar std ;usando std :: unique_ptr ;clase Base { public : virtual ~ Base () = default ;virtual void getMessage () { std :: println ( "¡Soy la superclase!" ); } };clase Derivada : pública Base { pública : void getMessage () override { std :: println ( "¡Soy la subclase!"); } };int main () { unique_ptr < Base > base = std :: make_unique < Base > (); unique_ptr < Base > derived = std :: make_unique < Derived > ();base -> getMessage (); // Llama a Base::getMessage(). derived -> getMessage (); // Llama a Derived::getMessage(). }Véase también
- Propiedad (programación)
- Invocación de método remoto
- Subrutina , también llamada subprograma, rutina, procedimiento o función.
Notas
- ↑ "¿Qué es un objeto?" . oracle.com . Oracle Corporation . Consultado el 13 de diciembre de 2013 .
- 1 2 Martin, Robert C. (2009). Clean Code: A Handbook of Agile Software Craftsmanship . Prentice Hall. p. 296. ISBN 978-0-13-235088-4.
- ↑ Meyer, Bertrand (1988). Construcción de software orientado a objetos . Cambridge: Prentice Hall International Series in Computer Science. pp. 52–54 . ISBN 0-13-629049-3.
- ↑ Bloch, Joshua (2018). "Effective Java: Programming Language Guide" (tercera ed.). Addison-Wesley. ISBN 978-0134685991.
- ^ Albahari, José. C# 10 en pocas palabras . O'Reilly. ISBN 978-1-098-12195-2.
- ↑ "Métodos y clases abstractas" . oracle.com . Documentación de Oracle Java . Consultado el 11 de diciembre de 2014 .
Referencias
- JANA, DEBASISH (1 de enero de 2005). C++ y el paradigma de la programación orientada a objetos . PHI Learning Pvt. Ltd. ISBN 978-81-203-2871-6.
- Sengupta, Probal (1 de agosto de 2004). Programación orientada a objetos: fundamentos y aplicaciones . PHI Learning Pvt. Ltd. ISBN 978-81-203-1258-6.
- Svenk, Goran (2003). Programación orientada a objetos: Uso de C++ para ingeniería y tecnología . Cengage Learning. ISBN 0-7668-3894-3.
- Balagurusamy (2013). Programación orientada a objetos con C++ . Tata McGraw-Hill Education. ISBN 978-1-259-02993-6.
- Kirch-Prinz, Ulla; Prinz, Peter (2002). Guía completa de programación en C++ . Jones & Bartlett Learning. ISBN 978-0-7637-1817-6.
- Conger, David (2006). Creación de juegos en C++: una guía paso a paso . New Riders. ISBN 978-0-7357-1434-2.
- Skinner, MT (1992). El libro avanzado de C++ . Silicon Press. ISBN 978-0-929306-10-0.
- Amor (1 de septiembre de 2005). Desarrollo del núcleo Linux . Pearson Education. ISBN 978-81-7758-910-8.
- DEHURI, SATCHIDANANDA; JAGADEV, ALOK KUMAR; RATH, AMIYA KUMAR (8 de mayo de 2007). PROGRAMACIÓN ORIENTADA A OBJETOS USANDO C++ . PHI Aprendizaje Pvt. Limitado. ISBN limitado 978-81-203-3085-6.
- Método (programación informática)
