Scala クラスとオブジェクト

クラスはオブジェクトの抽象化であり、オブジェクトはクラスの具体的なインスタンスです。クラスは抽象的でメモリを占有しませんが、オブジェクトは具象的でストレージスペースを占有します。 クラスは、オブジェクトを作成するためのブループリントであり、特定のタイプのオブジェクトに含まれるメソッドと変数を定義するソフトウェアテンプレートです。

newキーワードを使用して、クラスのオブジェクトを作成できます。次には例を挙げます。

実例

class Point(xc: Int, yc: Int) {
   var x: Int = xc
   var y: Int = yc

   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
  println ("x の座標: " + x);
      println ("y の座標: " + y);

   }
}

Scalaのクラスはpublicとして宣言されておらず、Scalaソースファイルに複数のクラスが存在することは可能です。

上記の実例のクラスは、2つの変数xとyや1つのメソッド(move)を定義しました。メソッドには返す値がありません。

Scalaのクラス定義には、上記のxc、ycのようなクラスパラメータと呼ばれるパラメータを含めることができます。クラスパラメータは、クラス全体でアクセスできます。

次には、newを使用してクラスをインスタンス化し、クラス内のメソッドと変数にアクセスします。

実例

import java.io._

class Point(xc: Int, yc: Int) {
   var x: Int = xc
   var y: Int = yc

   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
    println ("x の座標: " + x);
      println ("yの座標: " + y);

   }
}

object Test {
   def main(args: Array[String]) {
      val pt = new Point(10, 20);

  //新しい場所に移動します
      pt.move(10, 10);
   }
}

上記のコードを実行した出力結果は次となります。

$ scalac Test.scala 
$ scala Test

$ scalac Test.scala 
$ scala Test
x の座標: 20
y の座標: 30

Scala 継承

Scalaが基本クラスの継承についてはJavaと非常に似てますが、次のポイントに注意する必要があります。

  • 非抽象メソッドを書き直すには、override修飾子を使用する必要があります。
  • メインコンストラクターのみが基本クラスのコンストラクターにパラメータを書き込むことができます。
  • サブクラスのスーパークラスの抽象メソッドをオーバーライドする場合、overrideキーワードを使用する必要はありません。

次には、例を挙げます。

実例

class Point(xc: Int, yc: Int) {
   var x: Int = xc
   var y: Int = yc

   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
   println ("x の座標: " + x);
      println ("y の座標: " + y);

   }
}

class Location(override val xc: Int, override val yc: Int,
   val zc :Int) extends Point(xc, yc){
   var z: Int = zc

   def move(dx: Int, dy: Int, dz: Int) {
      x = x + dx
      y = y + dy
      z = z + dz
    println ("x の座標 : " + x);
      println ("y の座標 : " + y);
      println ("z の座標 : " + z);

   }
}

Scalaはextendsキーワードを使用してクラスを継承します。この実例では、LocationクラスはPointクラスを継承しています。 Pointは親クラス(基本クラス)と呼ばれ、Locationはサブクラスと呼ばれます。

override val xcは、親クラスをオーバーライドするフィールドです。

継承には親クラスのすべてのプロパティとメソッドを継承し、Scalaは1つの親クラスのみを継承することを許可されます。

次には例を挙げます。

実例

import java.io._

class Point(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("x の座標 : " + x);
      println ("y の座標 : " + y);

   }
}

class Location(override val xc: Int, override val yc: Int,
   val zc :Int) extends Point(xc, yc){
   var z: Int = zc

   def move(dx: Int, dy: Int, dz: Int) {
      x = x + dx
      y = y + dy
      z = z + dz
    println ("x の座標 : " + x);
      println ("y の座標 : " + y);
      println ("zの座標 : " + z);

   }
}

object Test {
   def main(args: Array[String]) {
      val loc = new Location(10, 20, 15);

 //新しい場所に移動します

      loc.move(10, 10, 5);
   }
}

上記のコードを実行した出力結果は次となります。

$ scalac Test.scala 
$ scala Test
$ scalac Test.scala 
$ scala Test
x の座標 : 20
y の座標 : 30
z の座標 : 20

Scalaで非抽象メソッドをオーバーライドする場合には、override修飾子を使用する必要があります。

実例

class Person {
  var name = ""
  override def toString = getClass.getName + "[name=" + name + "]"
}

class Employee extends Person {
  var salary = 0.0
  override def toString = super.toString + "[salary=" + salary + "]"
}

object Test extends App {
  val fred = new Employee
  fred.name = "Fred"
  fred.salary = 50000
  println(fred)
}

上記のコードを実行した出力結果は次となります。

$ scalac Test.scala 
$ scala Test
Employee[name=Fred][salary=50000.0]

Scala シングルトンオブジェクト

Scalaにはstaticがありませんが、キーワードオブジェクトを使用するシングルトンの実装メソッドも提供します。 

Scalaでシングルトンモードを使用する場合、定義されたクラス以外、同じ名前のobject オブジェクトを定義する必要があります。クラスとの違いは、object オブジェクトがパラメータを含むことができません。

シングルトンオブジェクトが特定のクラスと同じ名前を共有する場合、それはこのクラスのコンパニオンオブジェクト(companion object)と呼ばれます。 クラスとそのコンパニオンオブジェクトを同じソースファイルで定義する必要があります。クラスは、このシングルトンオブジェクトのコンパニオンクラス(companion class)と呼ばれます。クラスとそのコンパニオンオブジェクトは、互いのプライベートメンバーにアクセスできます。

シングルトンオブジェクトの実例

実例

import java.io._

class Point(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
   }
}

object Test {
   def main(args: Array[String]) {
      val point = new Point(10, 20)
      printPoint

      def printPoint{

    println ("x の座標 : " + point.x);
         println ("y の座標 : " + point.y);

      }
   }
}

上記のコードを実行した出力結果は次となります。

$ scalac Test.scala 
$ scala Test

$ scalac Test.scala 
$ scala Test
x の座標 : 10
y の座標 : 20

コンパニオンオブジェクトの実例

実例

/* ファイル名:Marker.scala
 * author:初心者チュートリアル
 * url:www.ceodata.com
 */

// privateコンストラクタ
class Marker private(val color:String) {

  println( this +"を作成します:")
  
  override def toString(): String = "カラーマーク"+ color
  
}

// コンパニオンオブジェクト、クラス名と同じで、クラスの privateプロパティとメソッドにアクセスできます。

object Marker{
  
    private val markers: Map[String, Marker] = Map(
      "red" -> new Marker("red"),
      "blue" -> new Marker("blue"),
      "green" -> new Marker("green")
    )
    
    def apply(color:String) = {
      if(markers.contains(color)) markers(color) else null
    }
  
    
    def getMarker(color:String) = { 
      if(markers.contains(color)) markers(color) else null
    }
    def main(args: Array[String]) { 
        println(Marker("red"))  
    // シングルトン関数呼び出し、.記号(ドット)を省略します  

                println(Marker getMarker "blue")  
    }
}

上記のコードを実行した出力結果は次となります。

$ scalac Marker.scala 
$ scala Marker
カラーマークを作成します:red
カラーマークを作成します:blue
カラーマークを作成します:green
カラーマーク:red
カラーマーク:blue
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です