Latest web development tutorials

เรียน Scala และวัตถุ

ระดับเป็นวัตถุที่เป็นนามธรรมและวัตถุนั้นเป็นกรณีเฉพาะของชั้น ชั้นเป็นนามธรรมและไม่ใช้หน่วยความจำและวัตถุเป็นคอนกรีตใช้พื้นที่จัดเก็บ ชั้นเป็นพิมพ์เขียวสำหรับการสร้างวัตถุมันเป็นซอฟแวร์ที่กำหนดแม่แบบรวมถึงวิธีการและตัวแปรในการระบุชนิดของวัตถุใน

เราสามารถใช้คำหลักใหม่ในการสร้างวัตถุของคลาสตัวอย่างดังต่อไปนี้:

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 ในชั้นเรียนจะไม่ได้รับการประกาศให้เป็นสาธารณะแฟ้มแหล่งที่มา Scala สามารถมีหลายชั้นเรียน

ตัวอย่างของการเรียนดังกล่าวข้างต้นกำหนดสองตัวแปรx และ y,วิธีการ: ย้ายวิธีการที่มีค่ากลับไม่มี

การกำหนดระดับ Scala สามารถมีพารามิเตอร์ที่เรียกว่าพารามิเตอร์ระดับเช่น XC ข้างต้น YC พารามิเตอร์ในชั้นเรียนทั้งชั้นสามารถเข้าถึง

แล้วเราสามารถใช้อินสแตนซ์ใหม่ในการเรียนและการเข้าถึงวิธีการเรียนและตัวแปร:

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 เขียนไม่ใช่วิธีนามธรรมต้องใช้ปรับปรุงแทนที่
  • 2 มีอยู่ในอดีตที่ผ่านมาเพียงตัวสร้างหลักของพารามิเตอร์เขียนชั้นฐานสร้าง
  • 3. เมื่อแทนที่ใน subclass ที่ superclass นามธรรมคุณไม่จำเป็นต้องใช้คำหลักแทนที่

ลองดูที่อินสแตนซ์:

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 ใช้ขยายคำหลักที่จะสืบทอดชั้นเรียน อินสแตนซ์ชั้นสถานที่สืบทอด Point คลาส จุดที่เรียกว่าระดับผู้ปกครอง (ชั้นฐาน), สถานที่ตั้งจะเรียกว่าเป็น subclass

ลบล้าง 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 เขียนไม่ใช่วิธีนามธรรมต้องแทนที่ปรับปรุง

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]

Scala วัตถุเดี่ยว

ในกาลาสิ่งนี้ไม่คงที่ แต่ก็ยังให้เรามีวิธีการที่จะประสบความสำเร็จในรูปแบบเดี่ยวและนั่นคือการใช้วัตถุคำหลัก

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

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