Scala - 類與物件



本章將引導您瞭解如何在 Scala 程式設計中使用類和物件。類是物件的藍圖。定義類後,可以使用關鍵字new從類藍圖建立物件。透過物件,您可以使用已定義類的所有功能。

下圖透過以 Student 類為例演示了類和物件,該類包含成員變數(姓名和學號)和成員方法(setName() 和 setRollNo())。最終,所有這些都是類的成員。類是藍圖,物件是現實。在下圖中,Student 是一個類,Harini、John 和 Maria 是 Student 類的物件,它們都具有姓名和學號。

Scala Classes and Objects

基本類

以下是定義 Scala 中基本類的簡單語法。此類定義了兩個變數xy以及一個方法:move,它不返回值。類變數稱為類的欄位,方法稱為類方法。

類名充當類建構函式,它可以接受多個引數。以上程式碼定義了兩個建構函式引數xcyc;它們在類的整個主體中都可見。

語法

class Point(xc: Int, yc: Int) {
   var x: Int = xc
   var y: Int = yc

   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("Point x location : " + x);
      println ("Point y location : " + y);
   }
}

如本章前面所述,您可以使用關鍵字new建立物件,然後可以訪問類欄位和方法,如下面的示例所示:

示例

import java.io._

class Point(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("Point x location : " + x);
      println ("Point y location : " + y);
   }
}

object Demo {
   def main(args: Array[String]) {
      val pt = new Point(10, 20);

      // Move to a new location
      pt.move(10, 10);
   }
}

將上述程式儲存到Demo.scala中。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

Point x location : 20
Point y location : 30

擴充套件類

您可以擴充套件基本 Scala 類,並且可以像在 Java 中一樣設計繼承類(使用extends關鍵字),但有兩個限制:方法重寫需要override關鍵字,並且只有建構函式可以將引數傳遞給基建構函式。讓我們擴充套件我們上面的類並新增另一個類方法。

示例

讓我們以兩個類 Point 類(與上面相同的示例)和 Location 類為例,Location 類使用 extends 關鍵字繼承類。這樣的“extends”子句有兩個作用:它使 Location 類繼承 Point 類中的所有非私有成員,並且它使型別Location成為型別Point類的子型別。所以這裡 Point 類稱為超類,類Location稱為子類。擴充套件類並繼承父類的所有功能稱為繼承,但 Scala 僅允許從一個類繼承。

注意- Point 類中的 move() 方法和Location 類中的 move() 方法沒有覆蓋 move 的相應定義,因為它們是不同的定義(例如,前者接受兩個引數,而後者接受三個引數)。

嘗試以下示例程式來實現繼承。

import java.io._

class Point(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("Point x location : " + x);
      println ("Point y location : " + y);
   }
}

class Location(override val xc: Int, override val yc: Int,
   val zc :Int) extends Point(xc, yc){
   var z: Int = zc

   def move(dx: Int, dy: Int, dz: Int) {
      x = x + dx
      y = y + dy
      z = z + dz
      println ("Point x location : " + x);
      println ("Point y location : " + y);
      println ("Point z location : " + z);
   }
}

object Demo {
   def main(args: Array[String]) {
      val loc = new Location(10, 20, 15);

      // Move to a new location
      loc.move(10, 10, 5);
   }
}

將上述程式儲存到Demo.scala中。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

Point x location : 20
Point y location : 30
Point z location : 20

隱式類

隱式類允許在類在範圍內時使用類的主要建構函式進行隱式轉換。隱式類是在類中使用“implicit”關鍵字標記的類。此功能是在 Scala 2.10 中引入的。

語法- 以下是隱式類的語法。這裡隱式類始終位於物件範圍內,其中允許所有方法定義,因為隱式類不能是頂級類。

語法

object <object name> {
   implicit class <class name>(<Variable>: Data type) {
      def <method>(): Unit =
   }
}

示例

讓我們以一個名為IntTimes的隱式類為例,其中包含方法 times()。這意味著 times() 包含一個迴圈事務,該事務將執行給定語句指定的次數。假設給定語句是“4 times println (“Hello”)”,這意味著 println (“”Hello”) 語句將執行 4 次。

以下是給定示例的程式。在此示例中使用了兩個物件類(Run 和 Demo),因此我們必須將這兩個類儲存到不同的檔案中,並分別使用以下名稱命名。

Run.scala- 將以下程式儲存到 Run.scala 中。

object Run {
   implicit class IntTimes(x: Int) {
      def times [A](f: =>A): Unit = {
         def loop(current: Int): Unit =
         
         if(current > 0){
            f
            loop(current - 1)
         }
         loop(x)
      }
   }
}

Demo.scala- 將以下程式儲存到 Demo.scala 中。

import Run._

object Demo {
   def main(args: Array[String]) {
      4 times println("hello")
   }
}

以下命令用於編譯和執行這兩個程式。

命令

\>scalac Run.scala
\>scalac Demo.scala
\>scala Demo

輸出

Hello
Hello
Hello
Hello

注意-

  • 隱式類必須定義在另一個類/物件/特質中(而不是在頂級)。

  • 隱式類在其建構函式中只能接受一個非隱式引數。

  • 隱式類不能是範圍內與隱式類同名的任何方法、成員或物件。

單例物件

Scala 比 Java 更面向物件,因為在 Scala 中,我們不能擁有靜態成員。相反,Scala 具有單例物件。單例是一個只能有一個例項的類,即物件。您可以使用關鍵字object而不是 class 關鍵字來建立單例。由於您不能例項化單例物件,因此您不能將引數傳遞給主建構函式。您已經看到了所有使用單例物件的示例,其中您呼叫了 Scala 的 main 方法。

以下是實現單例的相同示例程式。

示例

import java.io._

class Point(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
   }
}

object Demo {
   def main(args: Array[String]) {
      val point = new Point(10, 20)
      printPoint

      def printPoint{
         println ("Point x location : " + point.x);
         println ("Point y location : " + point.y);
      }
   }
}

將上述程式儲存到Demo.scala中。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

Point x location : 10
Point y location : 20
廣告