2011-06-30 11 views

Respuesta

15

La sobrecarga de método no es posible en Smalltalk. En su lugar, se usa una combinación de anulación de método y una técnica llamada double dispatch para implementar el mismo comportamiento que la sobrecarga del operador en otros lenguajes.

Puede encontrar una implementación de ejemplo en los operadores matemáticos +,*,/,- (que son mensajes binarios en Smalltalk). Aquí está la idea: la implementación de Integer>>+ envía un mensaje #addWithInteger: a su argumento. La implementación de #addWithInteger: se implementa en cada subclase de Magnitude, por ejemplo, para especializar la suma de Int + Int, Float + Int, etc.

+0

Creo que quiso decir "la sobrecarga del operador no es posible "en el primer párrafo? –

+2

No, quise decir "sobrecarga de método" ya que Smalltalk no tiene operadores (solo métodos). Los métodos de sobrecarga (es decir, la definición de métodos con el mismo selector pero diferentes "tipos" de entrada/salida) no son posibles. Tenga en cuenta que es posible el "polimorfismo ad hoc" (es decir, la definición de métodos con el mismo selector en diferentes clases). –

+0

Así que "sobrecarga de método" se refiere a lo que a menudo se llama polimorfismo "ad hoc", donde tiene, por ejemplo, 'int foo()', 'int foo (int)', y así sucesivamente: mismo nombre, firma de parámetro diferente. –

11

En su mayor parte, las cosas que son operadores en otros idiomas están en smalltalk unario o mensajes binarios como +, *, /, ... etc. Las clases son libres de responder a esos mensajes cuando les parezca, así que sí, puede redefinir el comportamiento de + y también puede hacer que las instancias de algunas clases que no sean números lo comprendan y respondan.

Por ejemplo, observe la implementación de + en la clase Punto.

Una cosa a tener en cuenta,: = y^no son mensajes, por lo que no se pueden redefinir de la manera descrita anteriormente.

Btw, para aprender Smalltalk, uno de los mayores recursos de ejemplos y códigos es la imagen de Smalltalk. Por lo tanto, le recomiendo que inicie Smalltalk y aprenda a navegar por la gran cantidad de ejemplos que contiene.

+1

: = y^no son mensajes pero, como señala Lukas Renggli, puede reemplazarlos por mensajes. Vea su comentario sobre esta respuesta: http://stackoverflow.com/questions/5638052/is-it-really-all-about-message-passing-in-smalltalk/5638259#5638259 –

6

No hay operadores en smalltalk, excepto la asignación. Todo se implementa en clases como métodos. Entonces, si desea cambiar el comportamiento de los métodos = o +/-, simplemente mire a sus implementadores. O si desea que las instancias de su clase entiendan esos mensajes, impleméntelos.

1

La etiqueta operator-overloading se define como el desbordamiento de pila

una característica de un lenguaje de programación que permite implementaciones personalizadas para los operadores en función de los tipos de los operandos involucrados. Algunos idiomas permiten que se definan nuevos operadores, mientras que otros solo permiten la redefinición de los existentes.

En Smalltalk
Todos los tipos se definen como clases de objeto *
Todos los operadores son métodos *
Todos los métodos son ejecutadas por el receptor del mensaje con el nombre del método
Todos los métodos pueden ser excesiva montado

Por lo tanto, cualquier desarrollador que opere en cualquier operando puede ser ignorado.

Éstos son algunos ejemplos:
objetos de la clase Float, Clase SmallInt, Clase y Clase FractionPoint todas pueden responder a un mensaje +. También pueden interrogarse unos con otros.
aFloat := 3.1415 . aSmallInt := '6' . aPoint := [email protected] . aFraction := 22/7 .

"enviar el mensaje + aSmallInt a aFraction"
aSum := aFraction + aSmallInt se evalúa como: 64/7

"enviar el mensaje + aFraction a aSmallInt"
aSum := aSmallInt + aFraction se evalúa como: 64/7

aSum := aFloat + aFraction aSum := aFraction + aFloat Estos evalúan a: 6.284357142857143

aSum := aFloat + aSmallInt aSum := aSmallInt + aFloat Estos se evalúan como: 9.1415

aSum := aPoint + aSmallInt aSum := aSmallInt + aPoint Estos evaluar a: [email protected]

En efecto, tenemos 8 implementaciones diferentes del operador + en la exhibición aquí, cada uno personalizado para hacer frente a los tipos de los operandos involucrados .

Las advertencias: * Los objetos no están fuertemente tipados. Cualquier variable de un tipo se puede cambiar a cualquier otro tipo, y el sistema no generará una excepción. Un objeto puede comenzar como un objeto de Class SmallInt y luego cambiarse a ByteString o Dictionary, y el sistema no generará la menor advertencia. Hasta que se envía un mensaje que no entiende.

Hay 6 primitivos que no son un objeto o clase de objeto: verdadero, falso, nil, etc.

Hay dos operadores que son, en efecto, el azúcar sintáctica para métodos nombrados.

+0

Para evitar confusiones: debe decir que "las variables no están fuertemente tipadas", porque de hecho los objetos sí lo están. Un objeto tiene una idea muy clara de qué clase es una instancia de (aunque incluso eso puede ser cambiado por el changeClassTo: hack). Y también debe escribir: "cualquier variable puede referirse a cualquier objeto", para enfatizar el hecho de que las variables solo tienen "punteros" (son enlaces). Especialmente la parte: "un objeto puede comenzar como ... y luego cambiarse a ..." es incorrecto y confuso. – blabla999

+0

Finalmente: la oración: "hay 6 primitivos ..." es incorrecta. true es una instancia de True, false de False-class, nil de la clase UndefinedObject, etc. – blabla999

Cuestiones relacionadas