scala入門チュートリアル:scalaのオブジェクト向け定義クラス、コンストラクション関数、継承

11557 ワード

scalaのすべてがオブジェクトであることを知っています.関数もオブジェクトであり、数字もオブジェクトであり、javaよりもオブジェクト向けの言語です.
scalaの単純クラスの定義
class Point (val x:Int, val y:Int)

上の行のコードはscalaクラスの定義です.
  • まずキーワードclass
  • 以降はクラス名Point
  • クラス名の後の括弧にはコンストラクション関数のパラメータリストがあり、ここではオブジェクトを定義する2つの定数に相当し、その名前はそれぞれx,yであり、タイプはいずれもInt
  • である.
    上のクラスと下のクラスは一致していますが、もっと簡素になりました.
    class Point (xArg:Int, yArg:Int) {   val x = xArg   val y = yArg }

    mainメソッドを書いて、このPointクラスの使い方を見てみましょう.
    object App {   def main(args : Array[String]) {     val p = new Point(10,20)     println("point info(" + p.x + "," + p.y + ")")   } }

    mainメソッドではval p=new Point(10,10)によってPointクラスのインスタンスを初期化し、p.xフィールドとp.yフィールドにアクセスできます.
    scalaオブジェクトの構造関数
    フィールドの構造関数を初期化するだけです
    以下のポイントクラスの例では、コンストラクション関数でisOriginが初期化されており、この点が原点であるかどうかを示しています.
    class Point (val x:Int, val y:Int) {   val isOriginal:Boolean = {     x == 0 && y == 0   } }

    上記のコードのisOriginalの後ろのカッコ内の内容はコンストラクション関数です.
    thisで定義されたscala構造関数
    class Point (val x:Int, val y:Int) {   val isOriginal:Boolean = {     x == 0 && y == 0   }   def this(xArg:Int) {
    println("hello, I'm this constructor")     this(xArg,0)   } }

    上記のコードでは、デフォルトのコンストラクション関数を呼び出し、xArgと0の値を伝達するパラメータが1つしかないコンストラクション関数が定義されています.このように書かれたコンストラクション関数は、フィールド以外のことを初期化することができます.コンストラクション関数間ではthis(...)で相互に呼び出すことができます.
    scalaの継承
    継承の実装
    次に、ポイントの継承クラスTalkPointを実現します.このポイントは、自分の座標を印刷することができます.
    class TalkPoint(x:Int, y:Int) extends Point (x,y) {   def talk() = {     println("my position is ("+x+","+y+")")   } }

    上のTalkPointクラスはPointに継承されます.デフォルトのコンストラクション関数に注意してください.x,yの前にvalの修飾はありません.extends Point(x,y)の後、ベースクラスのコンストラクション関数が自動的に呼び出されます.このサブクラスのtalkメソッドを次のコードで呼び出すことができます.
    object App {   def main(args : Array[String]) {     val p = new TalkPoint(0,0)     p.talk()   } }

    実行プログラム出力:my position is(0,0)
    ベースクラスを書き換える方法
    次に、TalkPointのtalkメソッドを書き換えるHappyTalkPointというTalkPointのサブクラスを作成します.次のコードがあります. 
    class HappyTalkPoint(x:Int, y:Int) extends TalkPoint(x,y) {   override def  talk() = {     println("I'm happy")     super.talk()   } }

     talkメソッドのdefキーワードの前にoverrideキーワードがあり、書き換えを表します.このキーワードは必要です.そうしないと、コンパイラがエラーを報告します.この点はjavaとは異なります.このメソッドの実装ではI'm happyを印刷し,super.talk()を介して親メソッドを呼び出した.
    Appクラスのmainメソッドを変更します.
    object App {   def main(args : Array[String]) {     val p = new HappyTalkPoint(0,0)     p.talk()   } }

    プログラムを実行すると、次のように出力されます.
    I'm happy my position is (0,0)