一天一段scala代碼(十)

一天一段scala代碼(十)

       爲了更好的駕馭spark,最近在學習scala語言特性,主要看《快學scala》,順便把一些自己認爲有用的代碼記下來。


package examples


//特質的基本使用

trait Logger
{
  def log(msg:String)   //不定義,抽象方法
}

class ConsoleLogger extends Logger
{
  def log(msg:String){println(msg)}  //重寫抽象方法不需要override
}

class Animal
{}


import scala.util.logging.Logged

class Cat extends Animal with Logged
{
    def sayHello=
    {
      log("Fuck!")
    }
}

trait ConsoleLogged extends Logged
{
  override def log(msg:String){println(msg)} //因爲Logged中log不是抽象方法,所以需要override
}

//Ordered接口的使用
class Rational(n:Int,d:Int) extends Ordered[Rational]
{
  def numer =n
  def demon = d
  def compare(that:Rational)=
  {
    this.numer*that.demon - that.numer*this.demon
  }
}


//特質作堆疊
abstract class IntQueue
{
  def get():Int
  def put(x:Int)
}

import scala.collection.mutable.ArrayBuffer
class BasicIntQueue extends IntQueue
{
  private val buffer = new ArrayBuffer[Int]
  def get=buffer.remove(0)
  def put(x:Int)={buffer+=x}
}

trait Incrementing extends IntQueue
{
  abstract override def put(x:Int)  {super.put(x+1)}
}

trait Filtering extends IntQueue
{
  abstract override def put(x:Int)
  {
    if(x>=0) super.put(x)
  }
}


object Example10 extends App{

  var cat = new Cat
  cat.sayHello //沒輸出,因爲Logged裏面的log沒有輸出
  
  println("------------------------")
  cat = new Cat with ConsoleLogged
  cat.sayHello //有輸出,因爲ConsoleLogged裏面的重寫了log,覆蓋了原Logged
  
  println("------------------------")
  val half = new Rational(1,2)
  val third = new Rational(1,3)
  println(half>third)
  
  println("------------------------")
  var queue = new BasicIntQueue with Incrementing with Filtering  //先過濾再遞增再進隊列
  queue.put(-1)
  queue.put(0)
  queue.put(1)
  println(queue.get)
  println(queue.get)
  
  println("------------------------")
  queue = new BasicIntQueue with Filtering  with Incrementing //先遞增再過濾再進隊列
  queue.put(-1)
  queue.put(0)
  queue.put(1)
  println(queue.get)
  println(queue.get)
  
  //從上面可以看出來,越在後面的特質越先起作用
  //如果她調用了super,然你就會接着調用她左邊的特質的對應方法
  
}

輸出
------------------------
Fuck!
------------------------
true
------------------------
1
2
------------------------
0
1



本文作者:linger

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章