1. 程式人生 > >Scala 繼承與多型與trait

Scala 繼承與多型與trait

1)scala中,讓子類繼承父類,與java一樣,使用extends關鍵字
		2)繼承就代表,子類可以從父類繼承父類的field和method,然後子類可以在自己內部放入父類所沒有,子類特有的filed和method,使用繼承可以複用程式碼
		3)子類可以覆蓋父類的filed和method,但是要注意的是final關鍵字,代表field和method無法覆蓋
		4)子類中的方法要覆蓋父類中的方法,必須寫override(參見foo)
		5)子類中的屬性val要覆蓋父類中的屬性,必須寫override(參見nameVal)
		6)父類中的變數不可以覆蓋(參見nameVar)
		4)定義抽象類
			abstract class Animal { //定義一個抽象類,用於繼承
			  var age :Int = 2
			  val weight:Double = 35

			  //抽象方法,沒有具體的實現
			  def color()

			  //非抽象方法,有具體的實現
			  def eat()={
				println("吃食物")
			  }
			  //使用了final關鍵字,表示不能重寫, override
			  final def action():Unit = {
				println ("奔跑")
			  }
			}
			/**
			  * 如果想實現父類的方法:CTRL+I
			  * 如果想重寫父類的方法:CTRL+O
			  */
			class Monkey extends Animal{
			   //重寫父類欄位
			  override var age:Int = 15
			  override val weight: Double = 15

			  //抽象方法,沒有實現(重寫父類抽象的方法,可以選擇性的使用override)
			  override def color(): Unit = {
				println("棕色")
			  }
			  //非抽象方法有實現了,(重寫父類非抽象方法,必須使用override)
			  override def eat(): Unit = {
				println("吃桃子")
			  }
			}
			object Monkey{
			  def main(args: Array[String]): Unit = {
				val monkey = new Monkey
				
				println(monkey.weight)
				println(monkey.color())
				println(monkey.eat())
				println(monkey.action())
			  }
			}
(*)多型
		1)什麼是多型:目的是為了讓程式碼更加,降低耦合
			有繼承或實現特質(介面)
			父類引用指向子類物件或介面指向實現類
			方法需要重寫
			
			abstract class Element {
			  def demo(): Unit ={
				println("Element's invoked")
			  }
			}
			class ArrayElement extends Element{
			  override def demo(): Unit = {
				println("ArrayElement's invoked")
			  }
			}
			class LineElement extends ArrayElement{
			  override def demo(): Unit = {
				println("LineElement's invoked")
			  }
			}
			class  UniforElement extends  Element //沒有重寫父類方法

			object ElementTest{
			  //引數型別為祖宗類,任何子類例項都可以傳遞(基類)
			  def invokedDemo(e:Element): Unit ={
				e.demo()  //多型,在執行時呼叫相應子類方法
			  }
			  def main(args: Array[String]): Unit = {
				invokedDemo(new ArrayElement) //父類引用指向子類物件
				invokedDemo(new LineElement) //祖父類引用指向孫類物件
				invokedDemo(new UniforElement) //沒有重寫父類方法,所以呼叫的時候輸出祖宗類demo
			  }
			}		
		}
	(*)trait:特質
		1)scala 特徵:相當於Java中的介面,實際上他比介面功能強大
		2)與介面不同的是:是可以定義屬性和方法的實現
		3)一般情況下scala的類只能被繼承單一父類,但是如果是trait的話可以實現多個繼承,從結果上來看就是實現了多繼承
		4)trait定義的方式與類類似,但是它使用的關鍵字是trait