Scalaオブジェクト向けプログラミング


1.1クラスの定義
1.private var修飾パラメータ、生成されたgetterとsetterもprivateであり、現在のクラスでのみ使用できます.
2.val age=14//getterメソッドを生成するだけで新しい定義age:s.age=15からはできません
3.privateを持たないvarパラメータはprivateのnameフィールドとして定義され、publicのgetterとsetterメソッドが提供されます.
4.private[this]と宣言した場合、getterメソッドとsetterメソッドは生成されません.
クラスコンストラクション関数にパラメータがない場合は、class Studio{}カッコを付けないで使用できます.
    //      Student  
    class Student(){
      private var name: String = "mike" // private var     ,    getter setter  private ,       
      
      val age = 14 //     getter         age :s.age = 15
      
      var isMale = true //   private var   ,    private name  ,   public getter setter  
      
      private[this] val classNum = "class2" //    private[this],     getter   setter   
      
      def sayHello() = {println("hello, everyone")}
      def getName = name // name        
      
      }
    

1.2オブジェクトのインスタンス化
    val s = new Student() //       
    s.sayHello()
    println(s.getName)
    println(s.age)
    s.isMale = false // var            
    println(s.isMale)
//    println(s.classNum)            

2.getterメソッドとsetterメソッドのカスタマイズ
カスタムgetterメソッドとsetterメソッドは、それぞれname、name_=に対応します.name、下線、=番号の間にスペースは使用できません
    class Student2(){
      var myName: String = "mike"
      def name = println("this is myname: " + myName)
      def name_= (newName: String){
        println("new name: " + newName)
      }
    }
    val s2 = new Student2()
    s2.name  //  this is myname: mike
    println(s2.myName)
    s2.myName = "zhangsan"
    s2.name // this is myname: zhangsan
    s2.name = "zhaosi" // new name: zhaosi         

3.主構造関数と補助構造関数
//コンストラクション関数は、オブジェクトの作成後に呼び出されます//プライマリコンストラクション関数です.Scalaはjavaとは異なり、コンストラクション関数はクラスカッコでpythonと同様にデフォルトパラメータとして割り当てることもできます//プライマリコンストラクション関数にvalまたはvar修飾がない場合、代表のこのパラメータはprivate[this]修飾です
セカンダリコンストラクション関数、最初の行はプライマリコンストラクション関数を呼び出す必要があります.セカンダリコンストラクション関数間で相互に呼び出すことができます.
    class Student3(var name: String, var age: Int){
      private var myNum: String = "1919101"  //          myNum  ,             ,         
      private var isMale: Boolean = true
      //       ,               ,               
      def this(name: String, age: Int, myNum: String){  //          
        this(name, age) //          
        this.myNum = myNum
        println("this is auxiliary constructor") 
      }
      
      def this(isMale: Boolean){   //          
        this("zhang", 14, "101901")
        this.isMale = isMale
        
      }
      override def toString = s"name: $name, age: $age, myNum: $myNum, isMale: $isMale"
      
      def show(){
        println("name : "+ name, " age: " + age + " myNum " + myNum )
      }
      
      
    }
    //              ,            , show   ,              
    val s3 = new Student3("zhangsan", 12) // name is : zhangsanage is :12
    println(s3.toString) // name: zhangsan, age: 12, myNum: 1919101, isMale: true
    s3.show() // (name : zhangsan, age: 12 myNum 1919101)   myNum      myNum
    s3.show
    val s31 = new Student3("zhangsan", 12, "19101910")
    s31.show()  // (name : zhangsan, age: 12 myNum 19101910)
    val s32 = new Student3(true) 
    println(s32.toString)  // name: zhang, age: 14, myNum: 101901, isMale: true

4.Scalaでの静的アプローチ:伴生オブジェクトと伴生クラス
classとclassと同じ名前のobjectがある場合、このobjectはclassの伴生オブジェクトであり、classはobjectの伴生クラスである.
      def myObjectMethod = Teacher.myPrint()/objectのメソッドに直接アクセスし、静的メソッドフォーマットで呼び出す
    class Teacher(val name: String, val age: Int){
      def show() = {
        //         ,       private    ,         .scala    
        println("name : "+ name + " age: " + age +" object name is :" + Teacher.myName)
        
      }
      def myObjectMethod = Teacher.myPrint() //      object     ,          
    }
    
    object Teacher{
      def apply(name: String, age: Int): Teacher ={
        new Teacher(name, age)
      }
      private val name = "zhaosi"
      
      def myPrint() ={
        println("name is : " + name)
      }
      def myName = name
    }
    
    val t = Teacher("zhangsan", 27) //           apply   ,     new
    println(t.name) 
    t.show() // name : zhangsan age: 27 object name is :zhaosi
    t.myObjectMethod // name is : zhaosi

5.匿名サブクラス
    class Human(val name: String)
    val h = new Human("wangzi"){   //       
      def speak(msg: String){
        println(name + " say " + msg)
      }
    }
    
    def func(h: Human{def speak(msg: String): Unit}){
      h.speak("hello")
    }
    
    //          {def speak(msg: String): Unit}   Human    func    
    func(h) // wangzi say hello
    class Hm(name: String) extends Human(name){  //        val var   ,                
      def speak(msg: String){
        println(name + " not say " + msg)
      }
    }
    val h1 = new Hm("lilisi")
    func(h1) // lilisi not say hello

6.親メソッドの上書きと呼び出し
override親を上書きする方法、superが親を呼び出す方法
    class Person1(){
      private val isMale: Boolean = true 
      private val name: String= "lisi"
      def getInformation(): String = if(isMale) "this is man" else "it is not a man"
      def getName = name
    }
    
    class Student4() extends Person1(){
     private val name: String = "zhaosi"
     override def getInformation: String = "this is my name: " + name +" " + super.getInformation()
    }
    
    val s4 = new Student4()
    println(s4.getName) // lisi
    println(s4.getInformation) // this is my name: zhaosi this is man
    
    // isInstanceOf                     
    println(s4.isInstanceOf[Person1]) // true
    println(s4.isInstanceOf[Student4])  // true
    //        .getClass == classOf[ ]       ,          
    println(s4.getClass == classOf[Person1]) // false
    println(s4.getClass == classOf[Student4]) // true

7.抽象クラス
抽象クラスのメソッドと属性はprivateではありません.サブクラスは抽象クラスのすべてのメソッドと属性を実現する必要があります.
    abstract class Demo(){
      var name: String  //   ,      private 
      def show()
    }
    //                  
    class MyDemo extends Demo{
      var name: String = "zhaosi "  // name    var            
      def pri = println("name : " + name)
      def show() = println("this is a class") // 
      def getName(): String = {
        name
      }
    }
    val m = new MyDemo
    m.pri // name : zhaosi 
    m.show