scala抽象_trait


メソッドに等号を書かないと戻り値もありますが、空の値です.
抽象クラス
クラスの1つ以上のメソッドには完全な定義がありません
抽象メソッドを宣言するにはabstractキーワードを追加する必要はありません.メソッドボディを書かないだけです.
子クラスが親クラスの抽象メソッドを書き換えるときにoverrideを追加する必要はありません
親は抽象フィールド(初期値のないフィールド)を宣言できます.
サブクラスは、親の抽象フィールドを書き換えるときにoverrideを追加する必要はありません.
package cn.chinahadoop.scala
class Basic3 {
}
abstract class Person1 {
  def speak;
}
class Student1 extends Person1 {
  def speak {
    println("speak!!!");
  }
}
object Basic3 extends App {
  //   
  val s = new Student1();
  s.speak;
}

結果:
speak!!!

抽出クラスの変数について
package cn.chinahadoop.scala
class Basic3 {
}
abstract class Person1 {
  def speak;
  val name: String
  var age: Int
}
class Student1 extends Person1 {
  val name = "AAA"
  var age = 100
  def speak {
    println("speak!!!");
  }
}
object Basic3 extends App {
  //   
  val s = new Student1();
  s.speak;
  println(s.name + " : " + s.age)
}

結果:
speak!!!
AAA : 100

最初は混入時にextendsを使い、後のクラスはwithを直接使うことができます.
package cn.chinahadoop.scala
class Basic3 {
}
abstract class Person1 {
  def speak;
  val name: String
  var age: Int
}
class Student1 extends Person1 {
  val name = "AAA"
  var age = 100
  def speak {
    println("speak!!!");
  }
}
trait Logger {
  def log(msg: String) {
    println("log" + msg)
  }
}
class Test extends Logger {
  def test {
    log("xxxx")
  }
}
object Basic3 extends App {
  //   
  //  val s = new Student1();
  //  s.speak;
  //  println(s.name + " : " + s.age)
  val t = new Test()
  t.test
}

結果:
logxxxx

trait抽象
package cn.chinahadoop.scala
class Basic3 {
}
abstract class Person1 {
  def speak;
  val name: String
  var age: Int
}
class Student1 extends Person1 {
  val name = "AAA"
  var age = 100
  def speak {
    println("speak!!!");
  }
}
//trait Logger {
//  def log(msg: String) {
//    println("log" + msg)
//  }
//}
//class Test extends Logger {
//  def test {
//    log("xxxx")
//  }
//}
//trait        
//trait ConsoleLogger {
//  def log(msg: String) {
//    println("save money: " + msg)
//  }
//}
trait Logger {
  def log(msg: String)
}
trait ConsoleLogger extends Logger {
  def log(msg: String) {
    println(msg)
  }
}
class Test extends ConsoleLogger {
  def test() {
    log("PPPT");
  }
}
object Basic3 extends App {
  //   
  //  val s = new Student1();
  //  s.speak;
  //  println(s.name + " : " + s.age)
    val t = new Test()
    t.test
}

結果:
PPPT

trait親が抽象的な方法ではない場合、この方法を書き直すにはキーワードoverrideを使用する必要があります.
package cn.chinahadoop.scala
class Basic3 {
}
abstract class Person1 {
  def speak;
  val name: String
  var age: Int
}
class Student1 extends Person1 {
  val name = "AAA"
  var age = 100
  def speak {
    println("speak!!!");
  }
}
//trait Logger {
//  def log(msg: String) {
//    println("log" + msg)
//  }
//}
//class Test extends Logger {
//  def test {
//    log("xxxx")
//  }
//}
//trait        
trait ConsoleLogger {
  def log(msg: String) {
    println("save money: " + msg)
  }
}
trait MessageLogger extends ConsoleLogger {
  override def log(msg: String) {
    println("save money to bank :" + msg)
  }
}
abstract class Account {
  def save
}
class MyAccount extends Account with ConsoleLogger {
  def save {
    log("100")
  }
}
//trait Logger {
//  def log(msg: String)
//}
//trait ConsoleLogger extends Logger {
//  def log(msg: String) {
//    println(msg)
//  }
//
//}
//
//class Test extends ConsoleLogger {
//  def test() {
//    log("PPPT");
//  }
//}
object Basic3 extends App {
  //   
  //  val s = new Student1();
  //  s.speak;
  //  println(s.name + " : " + s.age)
  //  val t = new Test()
  //  t.test
  val acc = new MyAccount
  acc.save
}

結果:
save money: 100

ちょくせつ混入
package cn.chinahadoop.scala
class Basic3 {
}
abstract class Person1 {
  def speak;
  val name: String
  var age: Int
}
class Student1 extends Person1 {
  val name = "AAA"
  var age = 100
  def speak {
    println("speak!!!");
  }
}
//trait Logger {
//  def log(msg: String) {
//    println("log" + msg)
//  }
//}
//class Test extends Logger {
//  def test {
//    log("xxxx")
//  }
//}
//trait        
trait ConsoleLogger {
  def log(msg: String) {
    println("save money: " + msg)
  }
}
trait MessageLogger extends ConsoleLogger {
  override def log(msg: String) {
    println("save money to bank :" + msg)
  }
}
abstract class Account {
  def save
}
class MyAccount extends Account with ConsoleLogger {
  def save {
    log("100")
  }
}
//trait Logger {
//  def log(msg: String)
//}
//trait ConsoleLogger extends Logger {
//  def log(msg: String) {
//    println(msg)
//  }
//
//}
//
//class Test extends ConsoleLogger {
//  def test() {
//    log("PPPT");
//  }
//}
object Basic3 extends App {
  //   
  //  val s = new Student1();
  //  s.speak;
  //  println(s.name + " : " + s.age)
  //  val t = new Test()
  //  t.test
  //  val acc = new MyAccount
  //  acc.save
  val acc =new MyAccount with MessageLogger
  acc.save
}

結果:
save money to bank :100

特質(trait)-比較したJAVA 8のインタフェース
1.フィールドと動作のセット.
2.クラスに混入する.
3.withキーワードにより、1つのクラスが複数の特質を拡張できます.
4.インタフェースとして使用します.
5.具体的なインプリメンテーションを有するインタフェース.
6.特質のある対象.
7.特質は左から右へ構造されている.
本文は“陳生龍”のブログから出て、転載をお断りします!