[Scala]Class

  • 722
  • 0
  • 2014-07-09

[Scala]Class

1.在Scala中 默認的屬性都是public,若要設為私有 要手動加上private,跟C#是相反的。

2.def 這個語句 是用來宣告委派的

3.get跟set語法 要注意喔,以後有提供兩種做法,當然視情況使用

 

 

Scala:

  1. 首先先建個類
  2. 再來寫個主程序 來進行調度 運行
  3. 細節請讀以下代碼附上的備註

 

   1: class FirstClass {
   2:  
   3:   //輔助構造式
   4: def this(firstValue:Int)=
   5: {
   6:   //至少要調用一個構造式(主或副都可),且一定要在開頭第一句
   7:   // 不然會拋錯
   8:   this();
   9:   this.value=firstValue;
  10:  
  11: }
  12:  
  13:   // private[this] var value=0
  14:   // ^ 上面的意思是,不能在自己內部使用本類的實體參數的私有變數
  15:   private var value=0
  16:  
  17:   //為了不暴露value屬性,也不給修改,故提供此方法
  18:   def increment()=value+=1
  19:  
  20:  
  21:   //外部取得value的值,省略"( )"
  22:   //取值器
  23:   def current=value;
  24:  
  25:   //示範在本類中 使用本類的實體參數 來取得私有變數
  26:   def isLess(other:FirstClass)=value<other.value
  27:  
  28:   //以下示範一般的Getter;Setter
  29:   private var _Age:Int=0
  30:   def Age=_Age
  31:   def Age_=(newAge:Int)
  32:   {
  33:     if (newAge>100)_Age=100
  34:     else _Age=newAge
  35:   }
  36:  
  37: }

 

 

 

   1: object MyApp {
   2:   def main(args: Array[String]) {
   3:  
   4:     val firstClass = new FirstClass(2);
   5:     for (i <- 1 to 10) {
   6:       firstClass.increment
   7:     }
   8:  
   9:     val firstClass2 = new FirstClass(3);
  10:     for (i <- 1 to 10) {
  11:       firstClass2.increment
  12:     }
  13:  
  14:     println(firstClass.current)
  15:  
  16:     println(firstClass2.current)
  17:  
  18:     println(firstClass.isLess(firstClass2))
  19:  
  20:     firstClass.Age=101;
  21:     println(firstClass.Age)
  22:  
  23:     firstClass.Age=99;
  24:     println(firstClass.Age)
  25:  
  26:   }
  27: }

 

Result:

image

 

 

 

Scala:

  1. 主建構式說明
  2. 細節請讀以下代碼附上的備註

 

   1: //主建構式 如下
   2: // 表示在new的時候一定要帶參數
   3: //以下這行為 主建構式
   4: // (宣告類別有帶參數 即為主建構式,參數為封閉變數 非全局變數)
   5: class SecondClass private (firstIndex:Int,initName:String) {
   6: //class SecondClass private (firstIndex:Int,initName:String) {
   7:   
   8:   //此為副建構式;非必要 有用到在建立 副建構式
   9:   def this(firstIndex:Int,initName:String,message:String)=
  10:   {
  11:     //若有設定主建構式 一定要呼叫 主建構式
  12:     this(firstIndex,initName);
  13:   }
  14:  
  15:   private var Index=firstIndex
  16:   val Name=initName
  17:  
  18:   def increment()=
  19:   {
  20:     Index+=1
  21:   }
  22:   def current=Index;
  23: }

 

   1: object MyApp {
   2:   def main(args: Array[String]) {
   3:  
   4:     val firstClass2 = new SecondClass(5,"Benson","");
   5:     println(firstClass2.current)
   6:  
   7:   }
   8: }
 
Result:
image 

 

 

 

Scala:

  1. Scala 允許你可在任何結構內遷入任何語法(類中包類,或是方法中包著類...)
  2. 以下代碼示範 類 中 類
  3. 細節請讀以下代碼附上的備註

 

   1: class GroupClass(groupName:String) {
   2:  
   3:   val GroupName=groupName
   4:   class Member(name:String)
   5:   {
   6:     val Name:String=name
   7:   }
   8:  
   9:  
  10:   var Members=new ArrayBuffer[GroupClass#Member]
  11: //以下方法可讓 Member類別 開放於GroupClass類別中
  12: //而不是活在實例的範圍中
  13: // var Members=new ArrayBuffer[GroupClass#Member]
  14:  
  15:  
  16:   def Join(name:String)=
  17:   {
  18:     var member=new Member(name)
  19:     Members+=new Member(name)
  20:     member
  21:   }
  22: }

  

   1: object MyApp {
   2:   def main(args: Array[String]) {
   3:  
   4:     val rd1=new GroupClass("RD1")
   5:     val tee=rd1.Join("Tee")
   6:  
   7:     val rd2=new GroupClass("RD2")
   8:     val hank=rd2.Join("Kristen")
   9:  
  10:     //以下這句 不行
  11:     //因為類中類的有效範圍只在 該 父類實體 的封閉區域中
  12:     //意思是 不能從 父類實體 外 new 實體 ,但可在父類實體外,呼叫 父類實體 方法(或屬性)取得實體
  13:     //若以下這句要可行 可觀看GroupClass內的備註
  14:     //rd1.Members+=hank
  15:   }
  16: }
 

   

   

  

By-藍小伙