2012-06-08 3 views
5

이 관용구는 계단 책에 꽤 몇 번 나타납니다 텍스트 책에서 몇 가지 포인트를 만들려고 노력 외에"val a : A = new B"무엇이 요점입니까? (?)

val b:A = new B 

또는

val b = new B 
val b2:A = b 

을, 당신은 왜를 선언 할 것 유추 한 타입과 다른 타입입니까?

그런데이 이름은 무엇입니까?

+0

를 들어 나는이 다형성을 – maxmc

+1

@maxmc라고하지만 객체가 여전히없이 다형성 될 것이다라고 말하고 싶지만 .. –

+0

@maxmc 당신은이 다형성을 얼마나 정확하게에 정교한 것이다 : -? pst처럼 나는 또한 이것이 다형성에 의해 의미되는 것과 정확히 같지 않다고 믿는다 ... –

답변

10

필자는 인터페이스 프로그래밍에 대한 관용구와 유사하다고 주장한다.

val b:A = new B 

을함으로써 당신은 그 시점 후 A에 의해 제공되는 인터페이스보다 더 아무것도에 의존하지 않는 있는지 확인하십시오. 즉, b:A = new C으로 변경하기로 결정하면 아무 것도 깨지지 않을 것입니다.

+0

나는 Liskov 대체 원리 (http://en.wikipedia.org/wiki/Liskov_substitution_principle)라고 불렀다. – thoredge

+3

나는 그것이 서로 다르다고 말할 것이다. 그러나 다르다. 명시 적으로 'b'유형을 제공한다고해서 'new B'에서 'new C'로 갈 때 프로그램의 동작이 동일하게 유지되는 것을 보장하지는 않습니다. Liskov 대체 원리는보다 개념적/고차원적인 개념 인 것으로 보인다. – aioobe

+1

이것을 _type ascription_이라고합니다. 'b : A'를 선언함으로써 타입'A'를 타입 B의 값으로 변환합니다. 당신은 사실, "내가 아는 한이 일은 단지 A"라고 말하고 있습니다. 선언을'val b = new B : A'라고 쓸 수도 있습니다. –

14

그것은 유용 할 수 있습니다

  1. 프로그래머의 의도 묘사 (나는 B를 생성 을하지만, 내가 관심 단지 행동) 당신이에 정의 된 메소드 만 사용하는 것을 보장
  2. A. 나중에 코드를 변경하지 않고도 콘크리트 구현을 바꿀 수 있습니다.
  3. IDE 또는 REPL을 사용할 때 사용할 수있는 자동 완성 목록을 단순화합니다.
  4. 암시 적 변환 강제 실행.

더 복잡한 인스턴스화의 경우 유추 된 유형이 올바른지 확인합니다. 예를

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) 
관련 문제