2012-06-08 10 views
5

ten idiom pojawia się kilka razy w książce schodowych:"val a: A = nowy B", o co chodzi? (?)

val b:A = new B 

lub

val b = new B 
val b2:A = b 

oprócz próbuje zrobić kilka punktów w książce tekstu, dlaczego chcesz, aby zadeklarować typ inny niż wywnioskowany typ czegoś?

Nawiasem mówiąc, wszelkie nazwy dla tego?

+0

powiedziałbym jest to tzw polimorfizmu – maxmc

+1

@maxmc ale obiekt nadal będzie polimorficzny bez niego .. –

+0

@maxmc Chcesz rozwinąć jak dokładnie to polimorfizmy: -? Podobnie jak pst I a także wierzę, że nie jest to dokładnie to, co rozumie się pod pojęciem polimorfizmu ... –

Odpowiedz

10

Twierdzę, że jest podobny do idiomu programowania względem interfejsów. Robiąc

val b:A = new B 

upewnić się, że po tym momencie nie jesteś powołując się na cokolwiek innego niż interfejs udostępniony przez A. Oznacza to, że jeśli kiedykolwiek zdecydujesz się na zmianę na b:A = new C nic się nie zepsuje.

+0

Uważam, że nazywa się to substytucją Liskov (http://en.wikipedia.org/wiki/Liskov_substitution_principle). – thoredge

+3

Powiedziałbym, że jest to powiązane, ale inne. Poprzez jawne podanie typu 'b' nie gwarantuje, że zachowanie programu pozostaje takie samo, kiedy przechodzimy od' nowego B' do wypowiedzenia 'nowego C'. Zasada substytucyjna Liskov wydaje się być pojęciem bardziej koncepcyjnym/wyższym. – aioobe

+1

Jest to nazywane _type ascription_. Deklarując 'b: A', wpisujesz _ typ' A' do wartości typu 'B'. Skutecznie mówisz: "O ile mi wiadomo, to jest po prostu A". Możesz również zapisać deklarację jako "val b = new B: A". –

14

Może to być użyteczne dla:

  1. Opisując intencje programisty (stworzyłem B, ale jestem zainteresowany tylko zachowanie)
  2. Zapewnienie, że będzie stosować wyłącznie metody określone w Odp .: Pozwoli to na zamianę implementacji konkretnej w późniejszym czasie bez konieczności zmieniania znacznej części twojego kodu.
  3. Uproszczenie listy automatycznego uzupełniania dostępnego podczas korzystania z IDE lub REPL.
  4. Wymuszenie niejawnej konwersji w pewnym momencie.

Dla bardziej złożonych wystąpień, zapewnia to, że wnioskowany typ jest właściwy. Na przykład

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) 
Powiązane problemy