เรียน 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