Scala 特性

DataCamp 最近推出了他們的第一個 Scala 課程:Scala 入门。快去看看吧!

你或許對閱讀以下教程感興趣:

簡介

Trait 是一個主要用於物件導向程式設計的概念,它通過一組方法延伸類的功能。

特點在靈性上與Java程式設計語言中的接口相似。不同的是,Scala的特點無法被實例化,並且沒有參數或變量。然而,您可以使用類和物件來繼承(擴展)它們。說到這里,特點為類別提供了一組特定的方法/函數,以執行行為並期待類別實作一組方法來 parameterize 所提供的行為。

用於定義物件的特點是以混合可用於不同類型的方法來創建的,而不需要多層繼承。然而,可能會存在例外情況,即兩個特點具有相同名稱的函數(命名衝突),必須被類使用,這種情況下必須明確解決模稜两可。

特點既可以有抽象也可以有非抽象的函數,字段作為其成員。在特點中你没有初始化函數,那麼它們是抽象的,而被初始化的則稱為非抽象。在抽象函數中,實現特點的類負責初始化。

現在,讓我們透過一些例子快速理解Scala的特點!

Scala 特點 語法

Scala特點的語法簡單直接,它是由關鍵詞trait跟上特點的名稱來定義。

trait Trait_Name{ // 變量 // 函數 }

從上面的特點定義可以看出,一個名為 DataCamp 的特點被定義了,里面沒有定義任何變量和方法。

我們來看一個Scala特點的簡單示例,這將使您對它們如何從程序上工作有更清晰的認識。

如在 引言 中所討論,Scala特點是用extends關鍵字由類繼承。

class Scala_Tutorial extends DataCamp{ // 變量 // 方法 }

讓我們定義一個名稱為 Scala_Course 的特點,它將被 DataCamp 類繼承。在特點中,您將定義一個叫做 scala()抽象方法,這将在DataCamp類中定義。

trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def scala(){ println("DataCamp has recently launched there first Scala course") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.scala() } }

現在讓我們運行上面的代碼。

在上面的一個示例中,scala()方法是一個抽象方法,因此,它的宣告是在繼承該特點的類中做出的。

但如果您在特點中已經實現了一個方法(非抽象)呢?那麼,繼承這個特點的類不需要實現特點中已經實現的方法。

讓我們用一個小的示例來理解這個問題。

trait BMW{ // 特性變量 var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 // 特性方法: 非抽象 def Display() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } } class Car extends BMW{ // 類別變量 var make1: String = "Mercedes Benz" var model1: String = "S350D" var fuel1: Int = 50 // 類別方法 def Merc_Specs() { println("Make of the Car : " + make1); println("Model of the Car : " + model1); println("Fuel capacity of the Car : " + fuel1); } } object Main { // 主方法 def main(args: Array[String]) { // 類別物件 var obj = new Car(); println("Calling the Class Method") obj.Merc_Specs(); println("Calling the Trait Method") obj.Display(); } }

讓我們運行以上代碼:

現在你已经理解了 abstract(抽象)和 non-abstract(非抽象)方法之間的差異,讓我們看看當一個 abstract 方法在繼承或擴展它的類別中沒有實現時會發生什麼。

讓我們使用相同的例子來理解這個概念。相同

trait Scala_Course{ def scala() } class DataCamp extends Scala_Course{ def print(){ println("Error: Class DataCamp needs to be Abstract") } } object Main{ def main(args:Array[String]){ var a = new DataCamp() a.print() } }

運行以上代碼會導致錯誤,如下所示,因為你沒有在繼承它的類別中定義特性方法 scala()(抽象)。

為了使以上代碼正常工作,可能有兩種可能的解決方案:

  • 在類別 DataCamp 中定義 scala() 方法,或者
  • 將類別 DataCamp 定義為 abstract

今天的教程最後一個主題是如何在一個類別中繼承多個特性。所以,讓我們快速完成它。

trait A{ // 方法 } trait B{ // 方法 } class C extends A with B{ }
trait BMW{ var make: String = "BMW" var model: String = "X7" var fuel: Int = 40 } trait Merc{ var make1: String = "Mercedes Benz" var model1: String = "S350D" var fuel1: Int = 50 } class Car extends BMW with Merc{ def BMW_Specs() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } def Merc_Specs() { println("Make of the Car : " + make1); println("Model of the Car : " + model1); println("Fuel capacity of the Car : " + fuel1); } } object Main { // 主方法 def main(args: Array[String]) { // 類別物件 var obj = new Car(); println("Calling the BMW Trait") obj.BMW_Specs(); println(); println("Calling the Merc Trait") obj.Merc_Specs(); } }

最後,讓我們運行上述代碼。

恭喜您!

恭喜您完成這個教程。

您現在已經知道在程式設計中什麼是Traits,以及如何在Scala中使用它們。對您來說,一個好的練習是尋找當繼承該類別的類別未定義抽象方法時的解決方案。嘗試為此编写代碼,並看看代碼是否能夠在不出現編譯錯誤的情況下運行。一個小提示,您可能想要查看Scala中的抽象類。

如果您對本教程有任何問題,請在下面的評論區域隨時提出。

最後,別忘了在DataCamp上參加新的Scala課程,Scala入門

Source:
https://www.datacamp.com/tutorial/scala-traits