scala 密封类与样例类

密封类:
1,使用 sealed 修饰的类或者特质,不能在类定义文件之外定义它的子类
2,可以避免滥用继承
3,用在模式匹配之中,可以让编译器在编译阶段进行检查,确保当前匹配的完整性
package day01
sealed abstract class Furniture
//定义两个样例类
case class Couch() extends Furniture
case class Chair() extends Furniture

object seale{
    // 方法体为 模式匹配
    def findPlaceToSit(furniture: Furniture):String =furniture match {
      case a:Couch => "line on couch"
      case b: Chair => "line on Chair"
    }
    val chair = Chair()

  def main(args: Array[String]): Unit = {
    println(findPlaceToSit(chair))
  }}
Scala中样例类是一中特殊的类,可用于模式匹配。case class是多例的,后面要跟构造参数,case object是单例的
package day01

object case_ {
  def main(args: Array[String]): Unit = {
    //定义样例类
    // 默认带有 applay 方法,不需要 new进行 创建对象(调用 applay方法)
    // 构造函数默认的是 public val 进行修饰的(可更改var,不推荐)
    case class Message( sender: String,recipient:String,body:String)
    //    case object是单例的
    case object CheckTimeOutTask
    // 类中有参和无参,当类有参数的时候,用case class ,当类没有参数的时候那么用case object。
    val che = CheckTimeOutTask
    println(che)  //CheckTimeOutTask
    // 创建样例类
    val message = Message("xiaoming","Tom","hello")
    println(message.body) //hello

//    case class Message(var sender: String,recipient:String,body:String)
//    message.sender="Jerry"

    val message1 = Message("xiaoming","Tom","hello")
    // 样例类的比较是基于值或者结构的比较,而不是基于引用的比较
    if(message==message1) println("same")
    else println("different")  //same

    //样例类的copy是 浅copy
    val message3 = message.copy()
    println(message3.sender+":"+message3.recipient+":"+message3.body)//xiaoming:Tom:hello
    if(message==message3)println("true") else println("false") //true

    //样例类不完全 copy ,部分赋值
    val message4 =message.copy("Tont")
    println(message4.sender+":"+message4.recipient+":"+message4.body)//Tont:Tom:hello
  }
}

 

posted @ 2019-06-25 23:14  十七楼的羊  阅读(670)  评论(0编辑  收藏  举报