2010-06-23 18 views
10

¿Cuál es el equivalente de Smalltalk de los campos y métodos estáticos de Java? IOW, ¿qué hacen los Smalltalkers cuando necesitan datos y/o métodos de nivel de clase?¿Cuál es el equivalente de Smalltalk de Java estático?

+0

No es digno de una respuesta "formal", pero me encontré con esta página que podría ayudarlo: http://per.bothner.com/papers/smalltalk.html. –

+0

Sugeriría dividir tu segunda pregunta en una _siguiente pregunta_. –

+0

@Frank: Bien. Como usted dice. – Jim

Respuesta

10

Utilizamos métodos de clase/variables de instancia. Una clase es un objeto, después de todo, entonces puede tener métodos.

Por ejemplo, la clase rectángulo tiene un método #origin: Esquina: por lo que puede escribir

Rectangle origin: [email protected] corner: [email protected] 

para crear un rectángulo. Este es solo el mensaje #origin: corner: enviado al objeto llamado Rectangle (¡una clase es un objeto!) Con los dos Puntos como parámetros.

Las variables de instancia del lado de la clase funcionan de la misma manera. Una clase, al ser un objeto, puede tener variables de instancia. Desde la biblioteca Sunit:

TestCase class 
    instanceVariableNames: 'history' 

y después de clase TestCase expone esto en la forma habitual, con un captador/definidor (#history y #history :).

EDITAR: El @ que he usado ha causado un poco de discusión. Es lo que se llama binary message, que le permite a uno definir selectores que se ven exactamente lo que otros lenguajes llamarían operadores de infijo. Por ejemplo, 3 + 4 o [email protected]. En el caso de @, la clase Number define un método llamado @ tomando un parámetro y, definido como ^Point x: self y: y - "devuelve un Punto cuya coordenada x es mi propio valor y cuya coordenada y es el parámetro".

Point es un par ordenado, pero, por supuesto, no hay nada que impida definir las versiones de mayor dimensión. Point podría definir un método llamado @ que se veía así, por ejemplo: ^Triple x: self x y: self y z: z - "devuelve un punto en R^3 cuyas coordenadas x, y son mías y cuya coordenada z es el parámetro dado".

+0

¿Usa algún otro idioma que no sea Smalltalk @ para delimitar las diferentes coordenadas de un punto? No creo haber visto esa sintaxis específica antes. – JAB

+0

¿Eso '@' indica una tupla? – Jim

+0

@ es un "mensaje binario" - un mensaje que toma un solo parámetro, pero no necesita el seguimiento habitual:. Number define un método llamado @ que devuelve un punto:^Point x: self y: y (donde y es el único parámetro, obviamente). –

1

En la mayoría de los tipos de Smalltalk tiene variables de clase. Normalmente, las variables de clase se utilizan para, p. singletons. Sin embargo, existen diferencias en los tipos de variables que puede usar entre los sabores de Smalltalk, así que lea la documentación sobre este punto para su implementación particular.

4

El cambio de mentalidad más importante que se necesita si viene a Smalltalk desde Java o similar, es que las clases son objetos.

Una estática en lenguajes similares a Java puede tener muchas semánticas diferentes. Por lo general, esto tiene que ver con la visibilidad. Necesita un objeto que sea independiente de cualquier instancia de una clase, pero desea restringir la visibilidad de este objeto dentro de la clase, es decir, solo visible desde instancias de la clase o la clase misma (en Smalltalk, porque en Java las clases no son objetos de primera clase).

En Smalltalk por lo general tienen más opciones para esto:

  1. variables de instancia de clase
  2. Las variables de clase o variables de la piscina (dependiendo de su dialecto Smalltalk)

Una variable de instancia de clase es de hecho al igual que una variable de instancia de instancias de cualquier clase: la clase tiene esta propiedad, y puede hacerse accesible para cualquier instancia de la clase al proporcionar un método getter en la clase (no en las instancias, a esto lo llamamos método de clase) . Esto es útil si tiene valores predeterminados y tal. Ejemplo:

definir una clase Car, con instancia de variable colour, además de una instancia de clase variable de defaultColour (que por supuesto tendría el valor "NEGRO" ;-))

Smalltalk defineClass: #Car 
    superclass: #{Core.Object} 
    indexedType: #none 
    private: false 
    instanceVariableNames: 'colour ' 
    classInstanceVariableNames: 'defaultColour' 
    imports: '' 
    category: '' 

Esta es una definición de clase (realmente un mensaje al objeto Smalltalk) en VisualWorks Smalltalk. Si crea una subclase de Car, hereda la variable de instancia de clase defaultColour, como lo haría también un objeto normal. Si la variable de instancia de clase defaultColour tiene un valor, la subclase también hereda este valor.

Cuestiones relacionadas