Método (programación informática)
Un método en programación orientada a objetos (POO) es un procedimiento asociado con un mensaje y un objeto. Un objeto consta de datos de estado y comportamiento; estos componen una interfaz, que especifica cómo el objeto puede ser utilizado por cualquiera de sus diversos consumidores. Un método es un comportamiento de un objeto parametrizado por un consumidor.
Los datos se representan como propiedades del objeto y los comportamientos se representan como métodos. Por ejemplo, un objeto Ventana
podría tener métodos como abrir
y cerrar
, mientras que su estado (si está abierto o cerrado en cualquier punto en el tiempo) 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 anulación del método: 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 mensaje de área a otro objeto y se invoca la fórmula apropiada si el objeto receptor es un rectángulo, círculo, triángulo
, etc.
Los métodos también proporcionan la interfaz que utilizan otras clases para acceder y modificar las propiedades de un objeto; esto se conoce como encapsulación. La encapsulación y la anulación son las dos principales características distintivas entre los métodos y las llamadas a procedimientos.
Anular y sobrecargar
La anulación y la sobrecarga de métodos son dos de las formas más significativas en que un método se diferencia de un procedimiento convencional o llamada de función. Anular se refiere a una subclase que redefine la implementación de un método de su superclase. Por ejemplo, findArea
puede ser un método definido en una clase de forma, triangle
, etc. cada uno definiría la fórmula adecuada para calcular su área. La idea es ver los objetos como "cajas negras" para que los cambios en las partes internas del objeto se puedan realizar con un impacto mínimo en los otros objetos que lo utilizan. Esto se conoce como encapsulación y tiene como objetivo facilitar el mantenimiento y la reutilización del código.
La sobrecarga de métodos, por otro lado, se refiere a diferenciar el código utilizado para manejar un mensaje en función de los parámetros del método. Si uno ve el objeto receptor como el primer parámetro en cualquier método, la anulación es solo un caso especial de sobrecarga donde la selección se basa solo en el primer argumento. El siguiente ejemplo simple de Java ilustra la diferencia:
Métodos de acceso, mutador y administrador
Los métodos de acceso se utilizan para leer los valores de datos de un objeto. Los métodos mutadores se utilizan para modificar los datos de un objeto. Los métodos de administrador se utilizan para inicializar y destruir objetos de una clase, p. 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 método de acceso getBalance()
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 método más mecanismo complejo para la recuperación de saldos (por ejemplo, una búsqueda de base de datos), sin necesidad de cambiar 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 los paradigmas anteriores, como los tipos de datos abstractos y la programación estructurada.
Constructores
Un constructor es un método que se llama al comienzo de la vida útil de un objeto para crear e inicializar el objeto, un proceso llamado construcción (o instanciación). La inicialización puede incluir una adquisición de recursos. Los constructores pueden tener parámetros, pero normalmente no devuelven valores en la mayoría de los idiomas. Vea el siguiente ejemplo en Java:
público clase Main {} String _name; int _roll; Main()String Nombre, int rollo) {} // método constructor esto._name = Nombre; esto._roll = rollo; }}
Destructores
Un destructor es un método que se llama automáticamente al final de la vida útil de un objeto, un proceso llamado destrucción. La destrucción en la mayoría de los idiomas no permite argumentos del método destructor ni valores de retorno. La destrucción se puede implementar para realizar tareas de limpieza y otras tareas en la destrucción de objetos.
Finalizadores
En los lenguajes de recolección de basura, como Java, C#</ref> y Python, los destructores se conocen como finalizadores. Tienen un propósito y una función similares a los de los destructores, pero debido a las diferencias entre los lenguajes que utilizan recolección de basura y los lenguajes con administración de memoria manual, la secuencia en la que se llaman es diferente.
Métodos abstractos
Un método abstracto es uno con solo una firma y sin cuerpo de implementación. A menudo se usa para especificar que una subclase debe proporcionar una implementación del método. Los métodos abstractos se utilizan para especificar interfaces en algunos lenguajes de programación.
Ejemplo
El siguiente código Java muestra una clase abstracta que debe ampliarse:
abstracto clase Forma {} abstracto int zona()int h, int w); // abstract method signature}
La siguiente subclase amplía la clase principal:
público clase Rectángulo extensiones Forma {} @Override int zona()int h, int w) {} retorno h * w; }}
Reabstracción
Si una subclase proporciona una implementación para un método abstracto, otra subclase puede volver a hacerlo abstracto. Esto se llama reabstracción.
En la práctica, esto rara vez se usa.
Ejemplo
En C#, un método virtual se puede anular con 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 vacío M() {} }}abstracto clase IB : IA{} público Anulación abstracto vacío M(); // permitido}
Interfaces' Los métodos predeterminados también se pueden volver a abstraer, lo que requiere subclases para implementarlos. (Esto también se aplica a Java).
interfaz IA{} vacío M() {} }}interfaz IB : IA{} abstracto vacío IA.M();}clase C : IB {} } // error: clase 'C' no implementa 'IA.M'.
Métodos de clase
Los métodos de clase son métodos que se llaman en una clase en lugar de una instancia. Por lo general, se utilizan 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 de metamodelo permiten crear y eliminar clases. En este sentido, proporcionan la misma funcionalidad que los constructores y destructores descritos anteriormente. Pero 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 del idioma y un idioma puede admitir ninguno, algunos o todos los métodos especiales definidos aquí. El compilador de un lenguaje puede generar automáticamente métodos especiales predeterminados o un programador puede tener la opción de definir métodos especiales. La mayoría de los métodos especiales no se pueden llamar directamente, sino que el compilador genera código para llamarlos en los momentos apropiados.
Métodos estáticos
Los métodos estáticos están destinados a ser relevantes para todas las instancias de una clase en lugar de para una instancia específica. Son similares a las variables estáticas en ese sentido. 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 hubiera una clase Product
, podría tener un método estático para calcular el precio promedio de todos los productos.
En Java, un método estático de uso común es:
Math.max(doble a, double b)
Este método estático no tiene objeto propietario y no se ejecuta en una instancia. Recibe toda la información de sus argumentos.
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 a la que se llaman y no dinámicamente como en el caso de los métodos de instancia, que se resuelven polimórficamente en función del tipo de tiempo de ejecución del objeto.
Operadores de asignación de copia
Los operadores de asignación de copia definen las acciones que debe realizar el compilador cuando un objeto de clase se asigna a un objeto de clase del mismo tipo.
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 de método asociados. Ejemplo de C++:
#include Identificadoclase Datos {} público: bool operador.()const Datos" datos) const {} retorno Roll_ . datos.Roll_; } bool operador==()const Datos" datos) const {} retorno name_ == datos.name_ " Roll_ == datos.Roll_; } privado: std::cuerda name_; int Roll_;};
Funciones miembro en C++
Algunos lenguajes de procedimiento se ampliaron con capacidades orientadas a objetos para aprovechar los grandes conjuntos de habilidades y el código heredado para esos lenguajes, pero aún brindan los beneficios del desarrollo orientado a objetos. Quizás el ejemplo más conocido es 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 de procedimiento 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 anular en clases derivadas y permitir el envío dinámico.
Funciones virtuales
Funciones virtuales son los medios por los cuales 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 de C++:
#include ■iostream#include - No.clase Super {} público: virtual ~Super() = por defecto; virtual vacío IAm() {} std::Cout .. "¡Soy la súper clase!n"; }};clase Subsidio : público Super {} público: vacío IAm() Anulación {} std::Cout .. ¡Soy la subclase!n"; }};int principal() {} std::único_ptr.Super■ inst1 = std::make_unique.Super■(); std::único_ptr.Super■ inst2 = std::make_unique.Subsidio■(); inst1-IAm(); // Calls SilencioSuper::IAm imper. inst2-IAm(); // Calls SilenciosoSub::IAm permanente.}