2009-11-26 6 views
25

¿Qué es el envío de métodos? Puedo encontrar varios ejemplos concretos, pero me elude una definición abstracta de envío de métodos. ¿Alguien se atreve a aventurar el suyo?¿Qué es el envío de métodos?

Respuesta

23

primer lugar vamos a decir que es un mensaje y un método son:

  • Un mensajees un nombre que puede ser enviado desde un objeto a otro, posiblemente con objetos adicionales como argumentos. Por ejemplo, en

    account withdraw: 100 
    

    El mensaje es withdraw: (sintaxis de Smalltalk.) (Otros idiomas pueden escribir account.withdraw(100).) El objeto que recibe el mensaje, en este ejemplo account, se llama el receptor .

  • A método es una implementación que se puede invocar en respuesta a un mensaje.

Estas ideas se comparten entre una amplia variedad de lenguajes orientados a objetos, a veces bajo diferentes nombres. Por ejemplo, C++ llama a un mensaje una 'función de miembro virtual'.

Ahora:

  • Método despacho es el algoritmo utilizado para decidir que método debe ser invocada en respuesta a un mensaje. Algoritmos varían dramáticamente en diferentes idiomas:

    • Los lenguajes como Smalltalk, que tienen clases y herencia simple, consulte la clase del receptor. Si el método está definido en esa clase, se invoca ese método. De lo contrario, el algoritmo verifica la superclase única, y así sucesivamente.

    • En C++, el método todavía está determinado por la clase del receptor, pero debido a que una clase puede tener múltiples superclases, el problema de decidir qué método invocar es más complicado.

    • En lenguajes como yo, que tienen métodos pero no hay clases, el método es o bien encontrarse en una llamada ranura en el propio receptor, o posiblemente se encuentra en el prototipo de la que se clonó el objeto.

    • En los lenguajes orientados a objetos más avanzados, el algoritmo de envío de métodos examina no solo el receptor sino también los argumentos que se transmiten junto con el mensaje. Esta idea a veces se denomina 'multimétodos'. (Hasta cierto punto, esta técnica puede simularse usando lo que Smalltalk llama al doble despacho, pero hay un costo de programación y un costo de rendimiento). Creo que los lenguajes Cecil, Diesel y Dylan usan algún tipo de envío multimétodo, pero Estoy tambaleando al borde de mi experiencia.

+0

Common Lisp también utiliza el envío multimétodo. –

+3

¿Puedes citar tus fuentes? –

+0

¿Es seguro decir que el envío de un método es muy similar a un controlador frontal en el negocio de aplicaciones web? –

11

Es difícil de decir sin contexto, pero lo describiría como el proceso que toma una invocación de método en el código fuente, decide qué método requiere ejecutarlo y lo ejecuta, realizando conversiones de argumento, por defecto, etc., según lo requiera el idioma. La parte de decisión del envío de métodos puede ser puramente en tiempo de ejecución (p. Ej. Java).

Diferentes idiomas pueden tener enfoques significativamente diferentes para el envío de métodos.

+0

Así que esto es similar al controlador frontal? –

+0

@samyismyhero: Eso depende de lo que quiere decir con "el controlador frontal" para ser honesto ... –

Cuestiones relacionadas