scala入門チュートリアル:scalaのオブジェクト向け定義クラス、コンストラクション関数、継承
11557 ワード
scalaのすべてがオブジェクトであることを知っています.関数もオブジェクトであり、数字もオブジェクトであり、javaよりもオブジェクト向けの言語です.
scalaの単純クラスの定義
上の行のコードはscalaクラスの定義です.まずキーワードclass 以降はクラス名Point クラス名の後の括弧にはコンストラクション関数のパラメータリストがあり、ここではオブジェクトを定義する2つの定数に相当し、その名前はそれぞれx,yであり、タイプはいずれもInt である.
上のクラスと下のクラスは一致していますが、もっと簡素になりました.
mainメソッドを書いて、このPointクラスの使い方を見てみましょう.
mainメソッドではval p=new Point(10,10)によってPointクラスのインスタンスを初期化し、p.xフィールドとp.yフィールドにアクセスできます.
scalaオブジェクトの構造関数
フィールドの構造関数を初期化するだけです
以下のポイントクラスの例では、コンストラクション関数でisOriginが初期化されており、この点が原点であるかどうかを示しています.
上記のコードのisOriginalの後ろのカッコ内の内容はコンストラクション関数です.
thisで定義されたscala構造関数
上記のコードでは、デフォルトのコンストラクション関数を呼び出し、xArgと0の値を伝達するパラメータが1つしかないコンストラクション関数が定義されています.このように書かれたコンストラクション関数は、フィールド以外のことを初期化することができます.コンストラクション関数間ではthis(...)で相互に呼び出すことができます.
scalaの継承
継承の実装
次に、ポイントの継承クラスTalkPointを実現します.このポイントは、自分の座標を印刷することができます.
上のTalkPointクラスはPointに継承されます.デフォルトのコンストラクション関数に注意してください.x,yの前にvalの修飾はありません.extends Point(x,y)の後、ベースクラスのコンストラクション関数が自動的に呼び出されます.このサブクラスのtalkメソッドを次のコードで呼び出すことができます.
実行プログラム出力:my position is(0,0)
ベースクラスを書き換える方法
次に、TalkPointのtalkメソッドを書き換えるHappyTalkPointというTalkPointのサブクラスを作成します.次のコードがあります.
talkメソッドのdefキーワードの前にoverrideキーワードがあり、書き換えを表します.このキーワードは必要です.そうしないと、コンパイラがエラーを報告します.この点はjavaとは異なります.このメソッドの実装ではI'm happyを印刷し,super.talk()を介して親メソッドを呼び出した.
Appクラスのmainメソッドを変更します.
プログラムを実行すると、次のように出力されます.
scalaの単純クラスの定義
class Point (val x:Int, val y:Int)
上の行のコードはscalaクラスの定義です.
上のクラスと下のクラスは一致していますが、もっと簡素になりました.
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)