English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

الصفات والكائنات لScala

الفئة هي تمثيل تجريدي للكائن، والكائن هو مثال مادي على الفئة. الفئة هي تجريدي، لا تستهلك ذاكرة، والكائن هو مادي، يستهلك مساحة التخزين. الفئة هي مخطط لإنشاء الكائنات، وهي نموذج برمجي يحدد الطرق والمتغيرات الموجودة في نوع معين من الكائنات.

يمكننا استخدام كلمة المفتاح new لإنشاء كائنات الفئة، مثل المثال التالي:

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("x 的坐标点: " + x);
      println("y 的坐标点: " + y);
   }
}

لا يتم إعلان الفئة في Scala كـpublic، يمكن أن يحتوي ملف المصدر في Scala على فئات متعددة.

تحدد الفئة في هذا المثال متغيرين. x و y ، طريقة واحدة:move، لا تعود أي قيمة.

يمكن أن يكون تعريف الفئة في Scala يحتوي على معلمات، يُطلق عليها معلمات الفئة، مثل xc،yc،ويمكن الوصول إلى معلمات الفئة في جميع أنحاء الفئة.

يمكننا استخدام new لإنشاء مثال على الفئة وت الوصول إلى الطرق والمتغيرات في الفئة:

import java.io._
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("x 的坐标点: " + x);
      println("y 的坐标点: " + y);
   }
}
object Test {
   def main(args: Array[String]) {
      val pt = new Point(10, 20);
      // 移动到一个新的位置
      pt.move(10, 10);
   }
}

تنفيذ الكود أعلاه، الناتج المطلوب هو:

$ scalac Test.scala 
$ scala Test
x 的坐标点: 20
y 的坐标点: 30

Scala 继承

Scala 继承与 Java 很相似,但我们需要注意以下几点:

  • 1、重新定义一个非抽象方法必须使用 override 修饰符。

  • 2、只有主构造函数才可以向基类的构造函数里写参数。

  • 3、在子类中重新定义超类的抽象方法时,你不需要使用 override 关键字。

接下来让我们来看一个示例:

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("x 的坐标点: " + x);
      println("y 的坐标点: " + 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("x 的坐标点 : " + x);
      println("y 的坐标点 : " + y);
      println("z 的坐标点 : " + z);
   }
}

Scala 使用 extends 关键字来继承一个类。示例中 Location 类继承了 Point 类。Point 称为父类(基类),Location 称为子类。

override val xc 为重写了父类的字段。

继承会继承父类的所有属性和方法,Scala 只允许继承一个父类。

以下是一个示例:

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("x 的坐标点 : " + x);
      println("y 的坐标点 : " + 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("x 的坐标点 : " + x);
      println("y 的坐标点 : " + y);
      println("z 的坐标点 : " + z);
   }
}
object Test {
   def main(args: Array[String]) {
      val loc = new Location(10, 20, 15);
      // 移动到一个新的位置
      loc.move(10, 10, 5);
   }
}

تنفيذ الكود أعلاه، الناتج المطلوب هو:

$ scalac Test.scala 
$ scala Test
x 的坐标点 : 20
y 的坐标点 : 30
z 的坐标点 : 20

Scala 重新定义一个非抽象方法,必须使用 override 修饰符。

class Person {
  var name = ""
  override def toString = getClass.getName + "[name=" + name + "]"
}
class Employee extends Person {
  var salary = 0.0
  override def toString = super.toString + "[salary=" + salary + "]"
}
object Test extends App {
  val fred = new Employee
  fred.name = "Fred"
  fred.salary = 50000
  println(fred)
}

تنفيذ الكود أعلاه، الناتج المطلوب هو:

$ scalac Test.scala 
$ scala Test
Employee[name=Fred][salary=50000.0]

السingleton في Scala

في Scala، لا يوجد شيء يُدعى static، ولكن يقدم لنا أيضًا طريقة تنفيذ نموذج السingleton باستخدام الكلمة المفتاحية object.

عند استخدام نموذج السingleton في Scala، يجب أن تعرف أيضًا object بنفس الاسم، والفرق بينه وبين الكائن هو أن object لا يمكن أن يحتوي على معاملات.

عندما يكون السingleton معادلاً لاسم某个类، فهو يُعتبر المرافق لهذا الكائن: object companion. يجب عليك أن تعرف الكائن والمرافق في نفس ملف المصدر. الكائن يُعتبر المرافق للسingleton: class companion. يمكن للكائن والمرافق أن يتبادلاً أعضاءهما الخاصة.

نموذج السingleton

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 Test {
   def main(args: Array[String]) {
      val point = new Point(10, 20)
      printPoint
      def printPoint{
         println ("نقطة التوزيع x: " + point.x);
         println ("نقطة التوزيع y: " + point.y);
      }
   }
}

تنفيذ الكود أعلاه، الناتج المطلوب هو:

$ scalac Test.scala 
$ scala Test
نقطة التوزيع x: 10
نقطة التوزيع y: 20

نموذج المرافق

/* 文件名:Marker.scala
 * author:基础教程网
 * url:ar.oldtoolbag.com
 */
// 私有构造方法
class Marker private(val color:String) {
  println("إنشاء " + this)}
  
  override def toString(): String = "علامة اللون: " + color
  
}
// الكائن المرافق، نفس اسم الصف، يمكنه الوصول إلى خصائص الصف الخاصة和方法ها
object Marker{
  
    private val markers: Map[String, Marker] = Map(
      "red" -> new Marker("red"),
      "blue" -> new Marker("blue"),
      "green" -> new Marker("green")
    )
    
    def apply(color: String) = {
      if(markers.contains(color)) markers(color) else null
    }
  
    
    def getMarker(color: String) = { 
      if(markers.contains(color)) markers(color) else null
    }
    def main(args: Array[String]) { 
        println(Marker("red"))  
        // استدعاء وظيفة وحيدة، تم تجاهل رمز الـ.(نقطة)  
                println(Marker getMarker "blue")  
    }
}

تنفيذ الكود أعلاه، الناتج المطلوب هو:

$ scalac Marker.scala 
$ scala Marker
إنشاء علامة اللون: الأحمر
إنشاء علامة اللون: الأزرق
إنشاء علامة اللون: الأخضر
علامة اللون: الأحمر
علامة اللون: الأزرق