Scalaクラス&オブジェクト(一)

3046 ワード

学習ノートTwitter scalaドキュメント:Twitter.github.io便宜上、本明細書のクラスの定義コードと呼び出しコードは同じ場所に置かれる.実際,コードの呼び出しはプログラムエントリ(mainメソッド)next:Scalaクラス&オブジェクト(二)に書く必要がある.
一、クラスの定義と作成
簡単な定義&呼び出し
class Calculator {
  val brand: String = "HP"
  def add(m: Int, n: Int): Int = m + n
 }
val calc = new Calculator //    
val res = calc.add(1, 2) //    
val brand = calc.brand  //    

上記の例では、クラスでdefでメソッドを定義し、valでフィールド値を定義する方法を示します.メソッドは、クラスのステータスにアクセスできる関数です.
コンストラクタ
コンストラクション関数は特殊な方法ではなく、クラスの方法定義以外のコードです.計算機の例を拡張し,構造関数パラメータを追加し,内部状態を初期化する.
class Calculator(brand: String) {
  /**
   * A constructor.
   */
  val color: String = if (brand == "TI") {
    "blue"
  } else if (brand == "HP") {
    "black"
  } else {
    "white"
  }

  // An instance method.
  def add(m: Int, n: Int): Int = m + n
}

val calc = new Calculator("HP")
calc.color //black

関数vsメソッド
関数とメソッドは大きく互換性があります.関数とメソッドがこのように似ているので、呼び出されたものが関数なのかメソッドなのか分からないかもしれません.
class C {
  var acc = 0
  def minc = { acc += 1 }  //  
  val finc = { () => acc += 1 } //  
}

val c = new C
c.minc // call method
c.finc // returns the function as a value
  • 関数とメソッドの違いは微妙で、言語の内部に深く入り込んでこそ
  • を理解することができます.
  • 方法と関数の違いを理解しなくても、Scalaで偉大なことをすることができます.
    二、継承
    class ScientificCalculator(brand: String) extends Calculator(brand) {
      def log(m: Double, base: Double) = math.log(m) / math.log(base)
    }
    

    リロード方法
    class EvenMoreScientificCalculator(brand: String) extends ScientificCalculator(brand) {
      def log(m: Int): Double = log(m, math.exp(1))
    }
    

    三、抽象類
  • 抽象クラスを定義できます.いくつかの方法を定義していますが、実装されていません.
  • は、代わりに、拡張抽象クラスのサブクラスによってこれらの方法を定義する.
  • 抽象クラスのインスタンスを作成することはできません.
  • abstract class Shape {
      def getArea: Int  // subclass should define this
    }
    class Circle(r: Int) extends Shape {
      def getArea: Int = r * r * 3 //pie 3
    }
    val c = new Circle(2) //        instance,     instance
    val area = c.getArea //area: 12
    

    四、特質(trait)
    特質はいくつかのフィールドと動作の集合で、あなたのクラスを拡張したり混入したりすることができます.
    trait Car {
      val brand: String
    }
    
    trait Shiny {
      val shineRefraction: Int
    }
    
    class BMW extends Car {
      val brand = "BMW"
    }
    

    withキーワードを使用すると、1つのクラスに複数の特質を拡張できます.
    class BMW extends Car with Shiny {
      val brand = "BMW"
      val shineRefraction = 12
    }
    

    抽象クラスではなく特質を使用するのはいつですか?
  • は特質を優先的に使用する.1つのクラスが複数の特質を拡張するのは便利ですが、抽象クラスは1つしか拡張できません.
  • 関数パラメータを構築する必要がある場合は、抽象クラスを使用します.抽象クラスはパラメータ付き構造関数を定義できるが,特質はできないからである.

  • 五、タイプ
    関数は、すべてのタイプに適用するために汎用であってもよい.この場合、四角カッコ構文で導入されたタイプのパラメータが表示されます.次の例では、汎用キーと値を使用したキャッシュを示します.
    trait Cache[K, V] {
      def get(key: K): V
      def put(key: K, value: V)
      def delete(key: K)
    }
    

    クラスに加えて、メソッドは汎用型も使用できます.
    def remove[K](key: K) //           
    

    next:Scalaクラス&オブジェクト(二)