2012-09-17 4 views
0
trait Rectangular{ 
def topLeft:Point 
def bottomRight:Point 
def left=topLeft.x 
def right=bottomRight.x 
def width=right-left 
//andmanymoregeometricmethods... 
} 


class Rectangle(val topLeft:Point,val bottomRight:Point) 
extends Rectangular{ 
//othermethods... 
} 

Rectangular에서는 추상 함수를 정의하고 기본 생성자에서 val을 사용하여 Rectangle 클래스에서이 함수를 구현합니다.스칼라 - 특성의 추상 함수

이것은 특성에 특별한 경우입니까? 이 예상되는 동작입니까?

이전에 그는 def의 것만이 def의 것을 대체 할 수 있다고 설명했습니다. 그러나이 경우 val은 추상적 인 함수를 구현하는데, 이것은 정말로 이상합니다.

+0

'누구'입니까? 이 책을 발췌 한 것입니까? – paradigmatic

+0

http://www.amazon.com/Programming-Scala-Comprehensive-Step---Step/dp/0981531644/ref=sr_1_1?ie=UTF8&qid=1347900072&sr=8-1&keywords=SCALA –

+1

내가 너라면, 그 책에서 멀리 떨어져있어. 저자는'def'와'val'을 오버라이드 할 수 있다는 잘못에 (또는 오해의 소지가 있음에도)뿐만 아니라, 저자는 또한 메소드와 함수의 차이에 대해 분명히 혼란 스럽습니다. 위 코드 스 니펫에는 추상화 또는 다른 기능이 없으며 메소드 만 있습니다. 스칼라에서 메소드와 함수의 차이점이 * 근본적으로 * 중요하다는 것을 고려하면 큰 실수가 될 것입니다. –

답변

3

a val은 실제로는 개인 변수를 정의하는 구문 설탕과 동일한 이름의 공용 getter 메서드이므로 val에는 기본적으로 def이 포함됩니다. defval으로 다시 정의하면 컴파일러에서 def을 재정의하는 함수로 getter 메서드를 사용합니다. defvar으로 재정의 할 수도 있는데, 이는 getter와 setter 메소드를 모두 정의합니다 (일반적으로 이러한 "좋은"코드는 고려하지 않겠지 만).

def을 사용하면 추상 속성을 정의하여 val, var 또는 def을 사용할지 여부를 구현자가 선택할 수 있습니다.

따라서 작성자가 defdef을 덮어 쓸 수 있다고 주장하면 올바르지 않습니다 (초기 버전의 스칼라에서 그렇습니까?).

+0

나는 내 친구에게서 다른 책을 읽었으므로 나는 그것을 읽은 곳을 100 % 확신하지 못했다. 아마도 그것은 저의 실수 였을 것입니다. 답변 해주셔서 감사합니다. –

1

불행히도 나는 그 책을 읽지 못했습니다. (부끄러움). 그러나 이것은 잘못된 것입니다. 을 val 또는 lazy val으로 재정의 할 수 있습니다. 이 패턴은 매우 일반적입니다.

이상한 행동을 피하려면 추상화 val을 피하는 것이 좋습니다.

관련 문제