Scala 類別和物件

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

同時,也来看看以下的教学教程:

簡介

Source

一般來說,面向對象程式設計(OOP)包括類別和物件,並旨在實現像是多型性、繼承等真实世界的事物。

OOP 可以使開發速度變快、成本降低,並提高軟體的可維護性。這種魔法的主要原因是它支持的特性數量;你有類別和物件,這些可以根據需求輕鬆地在未來重複使用,與缺乏類別和物件的程式相比。這進一步導致了軟體質量的提升,也具有新增方法和屬性的擴展性。

假設你有個汽車展示間;每几个月,一部新汽車就会被推出,為了通知觀眾關於这部新车 name and features, 你必須從頭定義新的方法、屬性。然而,如果你有個面向对象的程式,這個程式裡有一個汽車類別, 那你所做的就是為這款新汽車新增一個物件,這個物件會呼叫類別的方法與屬性,並傳入這部車的信息。

類別可以被視為物件的表現或設計。類別通常會有自己的方法(行為)和屬性

屬性是区分每個物件彼此的獨立实体,並決定物件的各种質量。方法,另一方面,更像是在程式中通常如何操作函數。它們決定類別實例的運作方式。正是因為方法(行為),物件才有能力對它們進行操作。

Source

上面的圖示给你更多关于面向对象程式設計的流程或更specifically, classes look like 的直觀印象。在上面 Pictures, there is a class car which has attributes: fuel, max speed, and can have more attributes like the model, make, etc. It has different sets of methods like refuel(), getFuel(), setSpeed(), and some additional methods can be change gear, start the engine, stop the engine, etc.

所以,當你談論一部特定的汽車,你會有一個物件,這是一個類別的實例化。

現在,我們來谈谈Scala中的面向對象程式設計。

Scala中的類別與物件

與C++和Java一樣,Scala中的面向對象程式設計基本上遵循相同的惯例。它有定義類別物件的概念,以及於類別建構子內,这就是Scala中的面向對象程式設計的全部。

類別宣告

class Class_name{ // 方法和屬性 }

在Scala中,類別是由class關鍵詞跟上類別的名稱定義,一般來說,類別名稱以大寫字母開始。有些關鍵詞是可选的,但可以在Scala類別宣告中使用,例如:class-name,它应以大寫字母開始:superclass, preceded by extend keyword的父類別名稱:traits,它是一個以逗號分隔的列表,由類別 preceded by extend keyword實作。

在Scala中,一個類別只能繼承一個父類別,這意味著Scala不支援多重繼承。然而,透過使用Traits可以實現这一点。

最後,Scala中類別的內容被大括號{}包圍。

// 類別的名稱是Car class Car { // 類別變量 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); } } object Main { // 主方法 def main(args: Array[String]) { // 類別物件 var obj = new Car(); obj.Display(); } }

您可以將以上程式碼儲存為 class.scala,並在終端機上以 scala class.scala 執行它,您應該會看到以下輸出。

好吧,以上程式碼並未充分利用物件導向程式的 privileges。由於以上程式碼的輸出结果與您運行次數無關,您在類別中定義了靜態變量,這些變量的值將保持不變,即使您創建無窮多的新物件也是如此。總結來說,您不能期望它能为您提供奔驰或法拉利轿车的詳細信息。

Scala 中的构造器

構造器主要用於初始化物件狀態。物件的初始化發生在物件創建時,且只被呼叫一次。

Scala 中有兩類構造器:主要輔助。對於本教程,您將學習主要構造器(來源:O’Reilly)。

class Class_name(Parameter_list){ // 方法、屬性 }

主要構造器包含與類相同的體,並且在類的定義 implicitly 同時創建。它從類的定義開始,横跨類的整個體。此外,當Scala程式中只有一個構造器時,它稱為主要構造器。主要構造器可以定義零個、一個或多個參數。

所以,讓我們取之前的示例,這次將主要構造函數特點添加到其中並觀察影響。

此外,您將學習類的一項新特性,即類可以具有多個物件或實例,但彼此獨立。

// 類的名稱是 Car class Car(make: String, model: String, fuel: Int) { // 類方法 def Display() { println("Make of the Car : " + make); println("Model of the Car : " + model); println("Fuel capacity of the Car : " + fuel); } } object Main { // 主方法 def main(args: Array[String]) { // 多個類物件 var obj1 = new Car("BMW", "X7", 40); var obj2 = new Car("Mercedes Benz", "S350D", 50); obj1.Display(); obj2.Display(); } }

讓我們快速查看輸出:

嗯,這不是很棒嗎?借助構造函數,您能夠產生更有效的結果。

在Scala中宣告物件

在Scala中宣告物件也可以稱為初始化類或調用類。與類一樣,物件也是面向對象程式設計的基本單元。

一個物件可以包含三個特性(來源:GeeksforGeeks:

  • 狀態: 物件的屬性代表它。它也反映物件的屬性。
  • 行為: 物件的方法代表它。它也反映物件與其他物件的互動。
  • 身份: 它給物件提供唯一的名稱,並使一個物件能夠與其他物件互動。

將 Dog 視為一個物件,並查看下面的 diagram 來了解其身份、狀態和行為。

(Source)

所有實例或物件共享類属性和方法。一個單一的類可以具有多個物件,正如您在 這裡 學到的。然而,每個物件的狀態或值是獨特的。

最後,您將撰寫一個程式碼,該程式碼將主要建構函數、類變量、屬性和方法結合在一個單一的程式碼中。

以下是一個圖形表示,展示了類 Motorcycle 中的部件。

下面的程式碼相當容易解釋;在高层次上,它檢查摩托車引擎是 on 還是 off。最初,引擎被置於關閉狀態,它將通知您其狀態並將其切換為开启。

class Motorcycle(make:String,color:String) { var engineState: Boolean = false; def startEngine() { if (engineState == true){ println("The engine is already on."); } else { engineState = true println("The engine is now on."); } } def showAtts() { println("This motorcycle is a "+ color + " " + make); if (engineState == true){ println("The engine is on."); } else{ println("The engine is off."); } } } object Main { def main (args: Array[String]) { var m = new Motorcycle("BMW K 1600 GTL","White"); println("Calling showAtts..."); m.showAtts(); println("------"); println("Starting engine..."); m.startEngine(); println("------"); println("Calling showAtts..."); m.showAtts(); println("------"); println("Starting engine..."); m.startEngine(); } }

恭喜您!

恭喜您完成本教程。

您現在知道如何在 Scala 中宣告類和方法、實例化物件、設定其屬性以及呼叫實例方法。這些概念將對您在 Scala 乃至其他程式語言中有所用處。

面向對象程式設計的概念既有趣又同時非常強大。它為您的代碼增添了新維度,使其可重用。隨著您的程式變得越來越大,您的代碼將會在複雜性上增長。面向對象程式設計概念中如繼承、多型、實例方法等,有很多實質內容。另一個強大的功能是單例(Singleton)。設計原則有助於保持您的代碼結構化和易讀性。關於設計模式的更多內容,請考慮閱讀這本書。

如果您對本教程有任何疑問,請在下面的評論部分隨時提問。

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

Source:
https://www.datacamp.com/tutorial/scala-classes-objects