Latest web development tutorials

دروس سكالا والأجسام

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

يمكننا استخدام الكلمة الجديدة لإنشاء كائنات من الدرجة، والأمثلة على النحو التالي:

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);
   }
}

غير معلنة سكالا في فئة كما الجمهور، يمكن ملف مصدر سكالا يكون فئات متعددة.

أمثلة من الطبقة المذكورة أعلاه تحدد اثنين من المتغيراتx و وهيطريقة:تحرك، وطريقة لا قيمة له العودة.

تعريف الفئة سكالا يمكن أن يكون المعلمات، ودعا معلمات الصف، مثل اختراق الضاحيه أعلاه، البطاقة الصفراء، المعلمات فئة في فئة كاملة يمكن الوصول إليها.

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

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

سكالا يرث

سكالا ترث فئة أساسية مع جافا هي مشابهة جدا، ولكن نحن بحاجة إلى الالتفات إلى النقاط التالية:

  • 1، كتابة طريقة غير مجردة يجب استخدام معدل التجاوز.
  • 2، وهو متاح في الماضي فقط منشئ الرئيسي للمعلمات منشئ الكتابة الفئة الأساسية.
  • 3. عندما تجاوز في فئة فرعية الفائقة مجردة، لا تحتاج إلى استخدام الكلمة التجاوز.

دعونا ننظر إلى المثال:

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);
   }
}

استخدام سكالا يمتد الكلمة في وراثة فئة. حالات الموقع يرث فئة الدرجة نقطة. دعا نقطة الفئة الأصل (الفئة الأساسية)، ويسمى المكان فئة فرعية.

تجاوز فال اختراق الضاحيه كتابة مجال الفئة الأصل.

كافة الخصائص والأساليب ترث سيرث الفئة الأصل، سكالا يسمح ترث فقط فئة أصل.

ومن الأمثلة على ذلك ما يلي:

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

سكالا كتابة طريقة غير مجردة يجب أن تتجاوز معدل.

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]

سكالا الكائن المفرد

في سكالا، وهذا الشيء ليس ثابتا، ولكنه يوفر لنا أيضا وسيلة لتحقيق نمط سينغلتون، وهذا هو لاستخدام الكائن الكلمة.

سكالا عند استخدامها في نموذج حالة واحدة، بالإضافة إلى تعريف الفئة، ولكن أيضا تعريف الكائن الهدف الذي يحمل نفس الاسم، هو الفرق بينه وبين الطبقة، كائن كائن لا يمكن أن المعلمات.

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

مثيلات الكائن المفرد

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:www.w3big.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
创建颜色标记:red
创建颜色标记:blue
创建颜色标记:green
颜色标记:red
颜色标记:blue