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は抽象関数を実装します。これは本当に奇妙なことです。

4

2 に答える 2

3

avalは実際には、同じ名前のプライベート変数とパブリックゲッターメソッドを定義するためのシンタックスシュガーであるため、val基本的にはを含みますdef。をでオーバーライドするdefval、コンパイラは、をオーバーライドする関数としてgetterメソッドを使用しますdef。をオーバーライドすることもできますdefvarこれは、ゲッターメソッドとセッターメソッドの両方を定義します(ただし、通常、このような動作を「適切な」コードとは見なしません)。

do define abstractプロパティを使用すると、実装者は、、、またはdefを使用するかどうかを選択できます。valvardef

したがって、作者defがオーバーライドできると主張している場合def、それは正しくありません(おそらく、Scalaの初期バージョンの場合でしたか?)。

于 2012-09-17T17:26:49.420 に答える
1

残念ながら、私はそのボクを読んだことはありません(恥ずべきことです)。しかし、これは間違っています。defvalまたはでオーバーライドできますlazy val。このパターンは非常に一般的です。

奇妙な振る舞いを避けるために、abstractを避けることを強くお勧めしvalます。

于 2012-09-17T17:17:02.033 に答える