Scala-クラスとオブジェクト

この章では、Scalaプログラミングでクラスとオブジェクトを使用する方法について説明します。クラスはオブジェクトの青写真です。クラスを定義したら、キーワードを使用してクラスブループリントからオブジェクトを作成できます。new。オブジェクトを介して、定義されたクラスのすべての機能を使用できます。

次の図は、メンバー変数(名前とロール番号)とメンバーメソッド(setName()とsetRollNo())を含むクラスstudentの例を使用して、クラスとオブジェクトを示しています。最後に、全員がクラスのメンバーです。クラスは青写真であり、オブジェクトはここで本物です。次の図では、Studentはクラスであり、Harini、John、およびMariaはStudentクラスのオブジェクトであり、名前とロール番号があります。

ベーシッククラス

以下は、Scalaで基本クラスを定義するための簡単な構文です。このクラスは2つの変数を定義しますx そして y および方法: move、値を返しません。クラス変数が呼び出され、クラスのフィールドとメソッドがクラスメソッドと呼ばれます。

クラス名は、いくつかのパラメーターを受け取ることができるクラスコンストラクターとして機能します。上記のコードは、2つのコンストラクター引数を定義しています。xc そして yc; それらは両方ともクラスの全身に表示されます。

構文

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 ("Point x location : " + x);
      println ("Point y location : " + y);
   }
}

この章で前述したように、キーワードを使用してオブジェクトを作成できます new 次に、以下の例に示すように、クラスのフィールドとメソッドにアクセスできます。

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 ("Point x location : " + x);
      println ("Point y location : " + y);
   }
}

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

      // Move to a new location
      pt.move(10, 10);
   }
}

上記のプログラムをに保存します Demo.scala。このプログラムをコンパイルして実行するには、次のコマンドを使用します。

コマンド

\>scalac Demo.scala
\>scala Demo

出力

Point x location : 20
Point y location : 30

クラスの拡張

基本のScalaクラスを拡張し、Javaで行うのと同じ方法で継承されたクラスを設計できます( extends キーワード)、ただし2つの制限があります:メソッドのオーバーライドには override キーワード、およびのみ primaryコンストラクターは、パラメーターを基本コンストラクターに渡すことができます。上記のクラスを拡張して、もう1つのクラスメソッドを追加しましょう。

2つのクラスPointクラス(上記と同じ例)の例を見てみましょう。Locationクラスはextendsキーワードを使用して継承されたクラスです。そのような 'extends'句には2つの効果があります。LocationクラスがPointクラスからすべての非プライベートメンバーを継承するようにすることと、LocationタイプをPointクラスタイプのサブタイプにすることです。したがって、ここではPointクラスが呼び出されますsuperclassクラスLocationは呼び出されますsubclass。クラスを拡張し、親クラスのすべての機能を継承することは、inheritance しかし、Scalaは1つのクラスからの継承のみを許可します。

Note − Pointクラスのメソッドmove()メソッドと move() method in Location class 移動の対応する定義は異なる定義であるため、オーバーライドしないでください(たとえば、前者は2つの引数を取り、後者は3つの引数を取ります)。

次のサンプルプログラムを試して、継承を実装してください。

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 ("Point x location : " + x);
      println ("Point y location : " + 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 ("Point x location : " + x);
      println ("Point y location : " + y);
      println ("Point z location : " + z);
   }
}

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

      // Move to a new location
      loc.move(10, 10, 5);
   }
}

上記のプログラムをに保存します Demo.scala。このプログラムをコンパイルして実行するには、次のコマンドを使用します。

コマンド

\>scalac Demo.scala
\>scala Demo

出力

Point x location : 20
Point y location : 30
Point z location : 20

暗黙のクラス

暗黙的なクラスは、クラスがスコープ内にあるときに、クラスのプライマリコンストラクターとの暗黙的な会話を許可します。暗黙のクラスは、「implicit」キーワードでマークされたクラスです。この機能はScala2.10で導入されました。

Syntax−以下は暗黙的なクラスの構文です。ここで、暗黙のクラスは常にオブジェクトスコープ内にあり、暗黙のクラスを最上位クラスにすることはできないため、すべてのメソッド定義が許可されます。

構文

object <object name> {
   implicit class <class name>(<Variable>: Data type) {
      def <method>(): Unit =
   }
}

名前の付いた暗黙のクラスの例を見てみましょう IntTimesメソッドtimes()を使用します。これは、times()に、指定されたステートメントを指定された回数だけ実行するループトランザクションが含まれていることを意味します。与えられたステートメントが「4回println( "Hello")」であると仮定すると、println( "" Hello ")ステートメントは4回実行されます。

以下は、与えられた例のプログラムです。この例では、2つのオブジェクトクラス(実行とデモ)が使用されているため、次のように、これら2つのクラスをそれぞれの名前で異なるファイルに保存する必要があります。

Run.scala −次のプログラムをRun.scalaに保存します。

object Run {
   implicit class IntTimes(x: Int) {
      def times [A](f: =>A): Unit = {
         def loop(current: Int): Unit =
         
         if(current > 0){
            f
            loop(current - 1)
         }
         loop(x)
      }
   }
}

Demo.scala −次のプログラムをDemo.scalaに保存します。

import Run._

object Demo {
   def main(args: Array[String]) {
      4 times println("hello")
   }
}

次のコマンドは、これら2つのプログラムをコンパイルして実行するために使用されます。

コマンド

\>scalac Run.scala
\>scalac Demo.scala
\>scala Demo

出力

Hello
Hello
Hello
Hello

Note

  • 暗黙のクラスは、別のクラス/オブジェクト/トレイト内で定義する必要があります(トップレベルではありません)。

  • 暗黙のクラスは、コンストラクターで1つの非暗黙の引数のみを取ることができます。

  • 暗黙のクラスは、暗黙のクラスと同じ名前のスコープ内のメソッド、メンバー、またはオブジェクトであってはなりません。

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

Scalaでは静的メンバーを持つことができないため、ScalaはJavaよりもオブジェクト指向です。代わりに、Scalaはsingleton objects。シングルトンは、1つのインスタンス、つまりObjectのみを持つことができるクラスです。キーワードを使用してシングルトンを作成しますobjectクラスキーワードの代わりに。シングルトンオブジェクトをインスタンス化できないため、パラメーターをプライマリコンストラクターに渡すことはできません。Scalaのmainメソッドを呼び出したシングルトンオブジェクトを使用したすべての例をすでに見てきました。

以下は、シングルトンを実装するための同じサンプルプログラムです。

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 Demo {
   def main(args: Array[String]) {
      val point = new Point(10, 20)
      printPoint

      def printPoint{
         println ("Point x location : " + point.x);
         println ("Point y location : " + point.y);
      }
   }
}

上記のプログラムをに保存します Demo.scala。このプログラムをコンパイルして実行するには、次のコマンドを使用します。

コマンド

\>scalac Demo.scala
\>scala Demo

出力

Point x location : 10
Point y location : 20