Class được khai báo sử dụng từ khoá abstract được hiểu là một abstract class. Abstract class có thể có các phương thức hoặc phương thức non-abstract. Abstract class thường được sử dụng để đạt được tính trừu tượng. Tính trừu tượng là một quá trình trong đó chúng ta ẩn đi các chi tiết thực thi phức tạp và chỉ hiển thị các chức năng cho người dùng.
Trong Scala, chúng ta có thể đạt được tính trừu tượng bằng cách sử dụng abstract class và trait. Chúng ta sẽ trình bày chi tiết hơn ngay sau đây
Ví dụ Abstract Class
Trong ví dụ này chúng ta sẽ tạo một abstract class Bike. Nó sẽ chứa một abstract phương thức. Class Hero sẽ extends từ nó và cung cấp thực thi khi chạy phương thức.
Một class mà extend abstract class thì phải cung cấp thực thi cho tất các các phương thức trong abstract class. Chúng ta sẽ không thể tạo một object cho abstract class.
abstract class Bike{ def run() } class Hero extends Bike{ def run(){ println("running fine...") } } object MainObject{ def main(args: Array[String]){ var h = new Hero() h.run() } }
Kết quả
running fine...
Constructor, biến và phương thức
Sau đây là ví dụ về abstract class dùng constructor, phương thức và biến.
abstract class Bike(a:Int){ // Tạo constructor var b:Int = 20 // Tạo các biến var c:Int = 25 def run() // phương thức def performance(){ // Phương thức non-abstract println("Performance awesome") } } class Hero(a:Int) extends Bike(a){ c = 30 def run(){ println("Running fine...") println("a = "+a) println("b = "+b) println("c = "+c) } } object MainObject{ def main(args: Array[String]){ var h = new Hero(10) h.run() h.performance() } }
Kết quả
Running fine... a = 10 b = 20 c = 30 Performance awesome
Phương thức abstract không được hoàn thành
Trong ví dụ này chúng ta sẽ không thực thi phương thức run() của abstract. Compiler sẽ đưa ra một lỗi trong khi biên dịch chương trình. Một thông báo lỗi sẽ được đưa ra như bên dưới
abstract class Bike{ def run() // Phương thức abstract } class Hero extends Bike{ // Không được thực thi trong class này def runHero(){ println("Running fine...") } } object MainObject{ def main(args: Array[String]){ var h = new Hero() h.runHero() } }
Kết quả
error: class Hero needs to be abstract, since method run in class Bike of type ()Unit is not defined class Hero extends Bike{ ^ one error found
Để tránh lỗi này hoặc là chúng ta phải thực thi tất cả các phương thức, members của abstract class hoặc là thực thi trong abstract class của chúng ta