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

2224 ワード

scala定義クラス:
class Counter{
	private var value = 0 //        
	def increment(){ value += 1}//        
}

クラスにはプライマリ・コンストラクタと任意の複数のセカンダリ・コンストラクタがあり、クラスにプライマリ・コンストラクタの定義が表示されていない場合、自動的にパラメータのないプライマリ・コンストラクタがあります.
アシストコンストラクタの名前はthisです.各アシストコンストラクタは、以前に定義された他のアシストコンストラクタまたはプライマリコンストラクタ呼び出しで開始する必要があります.
class Person{
	private var name = ""
	private var age = 0
	
	def this(name:String){
		this()//      
		this.name = name 
	}
	
	def this(name:String,age:Int){
		this(name)//         
		this.age = age
	}
}

オブジェクトは3つの方法で構築できます.
val p1 = new Person//      
val p2 = new Person("Fred")//          
val p3 = new Person("Fred",43)//          

scalaでは、各クラスにマスターコンストラクタがあり、マスターコンストラクタはthisメソッドで定義されるのではなく、クラス定義とインターリーブされます.
1.マスターコンストラクタのパラメータをクラス名の後に直接配置
class Person(val name:String,val age:Int){
	//(...)            
	...
}
マスタコンストラクタのパラメータはフィールドにコンパイルされ、その値は構造時に伝達されるパラメータに初期化され、この例ではnameとageはPersonクラスのフィールドとなる.
2.マスターコンストラクタは、クラス定義のすべての文を実行します.たとえば、次のようなクラスがあります.
class Person(val name:String,val age:Int){
	println("Just constructed another person")
	....
}
println文はメインコンストラクタの一部であり、オブジェクトが構築されるたびに上記のコードが実行されます.
scala定義オブジェクト
scalaクラスには静的メソッドと静的フィールドはありません.通常、インスタンスメソッドと静的メソッドの両方を持つクラスが使用されます.たとえば、クラスと同じ名前の「伴生」オブジェクトで同じ目的を達成できます.
class Account{
	val id = Account.newUniqueNumber()
	private val balance = 0.0
	def deposit(amount:Double) { balance += amount}
}

object Account{//    
	private var lastNumber = 0
	private def newUniqueNumber() = {lastNumber += 1;lastNumber}
}

クラスとその伴生オブジェクトは、同じソースファイルに存在する必要があるプライベートプロパティに相互にアクセスできます.scalaはオブジェクトを使用して実現します.
1.ツール関数と定数を格納する場所として
2.単一の可変インスタンスを効率的に共有
3.サービスを調整するために単一のインスタンスが必要な場合(単一のインスタンスモードを参照)
さらに、オブジェクトはクラスと1つ以上の特質を拡張できます.たとえば、次のようにします.
abstract class UndoableAction(val description:String){
	def undo():Unit
	def redo():Unit
}

object DoNothingAction extends UndoableAction("Do Nothing"){
	override def undo(){}
	override def redo(){}
}
DoNothingActionオブジェクトは、このデフォルトの動作を必要とするすべての場所で共有できます.
<>読書ノート