2012-06-08 11 views
5

este idioma aparece unas cuantas veces en el libro de escalera:"val a: A = new B", ¿cuál es el punto? (?)

val b:A = new B 

o

val b = new B 
val b2:A = b 

además de tratar de hacer algunos puntos en un libro de texto, ¿por qué quiere declarar una escriba diferente al tipo inferido de algo?

Por cierto, ¿algún nombre para esto?

+0

que diría esto se llama polimorfismo – maxmc

+1

@maxmc Pero el objeto seguiría siendo polimórficos sin ella .. –

+0

@maxmc ¿Quieres más detalles sobre cómo exactamente se trata de polimorfismos: -? Al igual que pst, también creo que esto no es exactamente lo que significa polimorfismo ... –

Respuesta

10

Yo diría que es similar al modismo de la programación en contra de las interfaces. Haciendo

val b:A = new B 

a asegurarse de que después de ese punto no está confiando en otra cosa que la interfaz proporcionada por A. Es decir, garantiza que si alguna vez decide cambiar a b:A = new C, nada se romperá.

+0

Creo que se llama el principio de sustitución Liskov (http://en.wikipedia.org/wiki/Liskov_substitution_principle). – thoredge

+3

Diría que está relacionado, pero es diferente. Al proporcionar explícitamente el tipo de 'b' no se garantiza que el comportamiento del programa siga siendo el mismo cuando se pasa de' new B' a decir 'new C'. El principio de sustitución de Liskov parece ser una noción más conceptual/superior. – aioobe

+1

Esto se llama _type ascription_. Al declarar 'b: A' que está _ascribiendo_ el tipo' A' a un valor de tipo 'B'. En realidad estás diciendo: "En lo que a mí respecta, esto es solo una A". También podría escribir la declaración como 'val b = new B: A'. –

14

Puede ser útil para:

  1. Al describir la intención del programador (creé una B, pero estoy interesado sólo el comportamiento Un)
  2. Asegurar que va a utilizar sólo los métodos definidos en R. Permitirá cambiar la implementación concreta de más tarde sin tener que cambiar gran parte de su código.
  3. Simplificando la lista de finalización automática disponible cuando se utiliza un IDE o REPL.
  4. Forzando una conversión implícita en algún punto.

Para instancias más complejas, asegura que el tipo inferido es el correcto. Por ejemplo

sealed trait Answer 
case object Yes extends Answer 
case object No extends Answer 

scala> val a = List(Yes, Yes, No) 
a: List[Product with Serializable with Answer] = List(Yes, Yes, No) 

scala> val b: List[Answer] = List(Yes, Yes, No) 
b: List[Answer] = List(Yes, Yes, No) 
Cuestiones relacionadas