Scala - Lớp & Đối tượng
Chương này sẽ hướng dẫn bạn cách sử dụng các lớp và đối tượng trong lập trình Scala. Một lớp là một bản thiết kế cho các đối tượng. Khi bạn xác định một lớp, bạn có thể tạo các đối tượng từ bản thiết kế lớp bằng từ khóanew. Thông qua đối tượng, bạn có thể sử dụng tất cả các chức năng của lớp đã xác định.
Sơ đồ sau thể hiện lớp và đối tượng bằng cách lấy một ví dụ về sinh viên lớp, trong đó có các biến thành viên (tên và số cuộn) và các phương thức thành viên (setName () và setRollNo ()). Cuối cùng tất cả đều là thành viên của lớp. Lớp là một bản in màu xanh lam và các đối tượng là thực ở đây. Trong sơ đồ sau, Sinh viên là một lớp và Harini, John và Maria là các đối tượng của lớp Sinh viên, những đối tượng này có tên và số cuộn.
Lớp cơ bản
Sau đây là một cú pháp đơn giản để xác định một lớp cơ bản trong Scala. Lớp này định nghĩa hai biếnx và y và một phương pháp: move, không trả về giá trị. Các biến lớp được gọi, các trường của lớp và các phương thức được gọi là phương thức lớp.
Tên lớp hoạt động như một hàm tạo lớp có thể nhận một số tham số. Đoạn mã trên xác định hai đối số hàm tạo,xc và yc; cả hai đều có thể nhìn thấy trong toàn bộ nội dung của lớp.
Cú pháp
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);
}
}
Như đã đề cập trước đó trong chương này, bạn có thể tạo các đối tượng bằng cách sử dụng từ khóa new và sau đó bạn có thể truy cập các trường và phương thức của lớp như được hiển thị bên dưới trong ví dụ:
Thí dụ
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);
}
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
Point x location : 20
Point y location : 30
Mở rộng lớp học
Bạn có thể mở rộng một lớp Scala cơ sở và bạn có thể thiết kế một lớp kế thừa giống như cách bạn làm trong Java (sử dụng extends từ khóa), nhưng có hai hạn chế: ghi đè phương thức yêu cầu override từ khóa và chỉ primaryphương thức khởi tạo có thể truyền các tham số cho phương thức khởi tạo cơ sở. Hãy để chúng tôi mở rộng lớp ở trên và thêm một phương thức lớp nữa.
Thí dụ
Chúng ta hãy lấy một ví dụ về hai lớp Lớp điểm (giống như ví dụ trên) và lớp Vị trí là lớp kế thừa bằng cách sử dụng từ khóa expand. Như một 'extendsMệnh đề 'có hai tác dụng: nó làm cho lớp Location kế thừa tất cả các thành viên không phải private từ lớp Point và nó làm cho kiểu Location trở thành một kiểu con của kiểu lớp Point . Vì vậy, ở đây lớp Point được gọi làsuperclassvà Vị trí của lớp được gọi làsubclass. Mở rộng một lớp và kế thừa tất cả các tính năng của một lớp cha được gọi làinheritance nhưng Scala chỉ cho phép thừa kế từ một lớp.
Note - Phương thức move () trong lớp Point và move() method in Location class không ghi đè các định nghĩa di chuyển tương ứng vì chúng là các định nghĩa khác nhau (ví dụ: định nghĩa trước có hai đối số trong khi định nghĩa sau có ba đối số).
Hãy thử chương trình ví dụ sau để thực hiện kế thừa.
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);
}
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
Point x location : 20
Point y location : 30
Point z location : 20
Các lớp ngầm định
Các lớp ngầm định cho phép các cuộc hội thoại ngầm với phương thức khởi tạo chính của lớp khi lớp nằm trong phạm vi. Lớp ngầm định là lớp được đánh dấu bằng từ khóa 'ẩn'. Tính năng này được giới thiệu trong Scala 2.10.
Syntax- Sau đây là cú pháp cho các lớp ngầm định. Ở đây lớp ngầm định luôn nằm trong phạm vi đối tượng nơi cho phép tất cả các định nghĩa phương thức vì lớp ngầm định không thể là lớp cấp cao nhất.
Cú pháp
object <object name> {
implicit class <class name>(<Variable>: Data type) {
def <method>(): Unit =
}
}
Thí dụ
Hãy để chúng tôi lấy một ví dụ về một lớp ngầm định có tên IntTimesvới phương thức times (). Nó có nghĩa là times () chứa một giao dịch lặp sẽ thực hiện câu lệnh đã cho với số lần mà chúng tôi đưa ra. Giả sử câu lệnh đã cho là “4 lần println (“ Xin chào ”)” có nghĩa là câu lệnh println (““ Xin chào ”) sẽ thực thi 4 lần.
Sau đây là chương trình cho ví dụ đã cho. Trong ví dụ này, hai lớp đối tượng được sử dụng (Run và Demo) để chúng ta phải lưu hai lớp đó trong các tệp khác nhau với tên tương ứng của chúng như sau.
Run.scala - Lưu chương trình sau trong 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 - Lưu chương trình sau trong Demo.scala.
import Run._
object Demo {
def main(args: Array[String]) {
4 times println("hello")
}
}
Các lệnh sau được sử dụng để biên dịch và thực thi hai chương trình này.
Chỉ huy
\>scalac Run.scala
\>scalac Demo.scala
\>scala Demo
Đầu ra
Hello
Hello
Hello
Hello
Note -
Các lớp ngầm định phải được định nghĩa bên trong một lớp / đối tượng / đặc điểm khác (không phải ở cấp cao nhất).
Các lớp ngầm định chỉ có thể nhận một đối số không rõ ràng trong hàm tạo của chúng.
Các lớp ngầm định không được là bất kỳ phương thức, thành viên hoặc đối tượng nào trong phạm vi có cùng tên với lớp ngầm định.
Đối tượng Singleton
Scala hướng đối tượng hơn Java vì trong Scala, chúng ta không thể có các thành viên tĩnh. Thay vào đó, Scala cósingleton objects. Singleton là một lớp chỉ có thể có một thể hiện, tức là Object. Bạn tạo singleton bằng từ khóaobjectthay vì từ khóa lớp. Vì bạn không thể khởi tạo một đối tượng singleton, bạn không thể chuyển các tham số cho hàm tạo chính. Bạn đã thấy tất cả các ví dụ sử dụng các đối tượng singleton mà bạn đã gọi phương thức chính của Scala.
Sau đây là chương trình ví dụ tương tự để triển khai singleton.
Thí dụ
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);
}
}
}
Lưu chương trình trên vào Demo.scala. Các lệnh sau được sử dụng để biên dịch và thực thi chương trình này.
Chỉ huy
\>scalac Demo.scala
\>scala Demo
Đầu ra
Point x location : 10
Point y location : 20