Scala-classes-objects
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つのクラスメソッドを追加しましょう。
例
Pointクラス(上記と同じ例)の2つのクラスの例を取り上げましょう。Locationクラスはextendsキーワードを使用して継承されたクラスです。 このような「 extends 」句には2つの効果があります。LocationクラスにPointクラスからすべての非プライベートメンバーを継承させ、_Location_型を_Point_クラス型のサブタイプにします。 したがって、ここではPointクラスは superclass と呼ばれ、クラス_Location_は subclass と呼ばれます。 クラスを拡張し、親クラスのすべての機能を継承することを*継承*と呼びますが、Scalaでは1つのクラスのみからの継承を許可しています。
注-Pointクラスのmove()メソッドとLocationクラスの* move()メソッドは、異なる定義であるため、対応するmoveの定義をオーバーライドしません(たとえば、前者は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
暗黙のクラス
暗黙のクラスは、クラスがスコープ内にあるときに、クラスのプライマリコンストラクターとの暗黙の会話を許可します。 暗黙クラスは、「暗黙」キーワードでマークされたクラスです。 この機能はScala 2.10で導入されました。
構文-暗黙的なクラスの構文は次のとおりです。 ここで、暗黙クラスは最上位クラスになることができないため、すべてのメソッド定義が許可されるオブジェクトスコープに常に暗黙クラスがあります。
構文
object <object name> {
implicit class <class name>(<Variable>: Data type) {
def <method>(): Unit =
}
}
例
times()メソッドを使用した IntTimes という名前の暗黙的なクラスの例を見てみましょう。 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
注-
- 暗黙のクラスは、別のクラス/オブジェクト/トレイト(トップレベルではない)内で定義する必要があります。
- 暗黙的なクラスは、コンストラクターで1つの非暗黙的な引数のみを取ることができます。
- 暗黙のクラスは、暗黙のクラスと同じ名前のスコープ、メソッド、メンバー、またはオブジェクトであってはなりません。
シングルトンオブジェクト
Scalaは静的メンバーを持つことができないため、ScalaはJavaよりもオブジェクト指向です。 代わりに、Scalaには*シングルトンオブジェクト*があります。 シングルトンは、1つのインスタンス(オブジェクト)のみを持つことができるクラスです。 classキーワードの代わりにキーワード 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