組合せと継承の定義パラメータなしメソッド

1149 ワード

次に前編のblogの例では、幅と高さを表示する方法をElementに追加します.次の例に示すように、heightメソッドはcontents内の行数を返します.widthメソッドは、最初のローの長さを返し、要素にローがない場合はゼロを返します.
package scala

abstract class Element {
    def contents:Array[String]
    def heigth:Int = contents.length
    def width:Int = if(heigth == 0) 0 else contents(0).length
}

注意Elementの3つの方法はすべてパラメータリストがなく、空のリストさえありません.この無パラメータ法はscalaで非常に一般的である.対照的に、def heigth():Intのような、空括弧付きメソッド定義は、空括弧メソッドと呼ばれる.
方法ではなくwidthとheightをフィールドとして実現することもできます.defをvalに簡単に変更すればいいです.
package scala

abstract class Element {
    def contents:Array[String]
    val heigth = contents.length
    val width = if(heigth == 0) 0 else contents(0).length
}

2つのグループの定義は、お客様の観点から全く同じです.唯一の違いは、クラスの初期化時にフィールド値が推定され、メソッド呼び出しのたびにメソッド呼び出しが計算されるため、呼び出しメソッドよりもアクセスフィールドがやや速いことです.一方、フィールドを使用するには、各Elementオブジェクトにより多くのメモリ領域を割り当てる必要があります.したがって、1つのプロパティがフィールドでより良いか、またはメソッドでより良いかは、クラスの使用状況に関係しています.
要するに、scalaは、パラメータを持たず、副作用のない方法をパラメータなし方法として定義するスタイル、すなわち、括弧を省略することを奨励する.しかし、カッコのない副作用のある方法を定義しないでください.そうすると、方法呼び出しがフィールドを使用しているように見えるので、お客様はなぜ副作用があるのか不思議に思っています.これにより、副作用のあるメソッドが呼び出されたときに、空のカッコのペアが含まれていることを確認します.