Abstrac class dibuat hanya untuk keperluan diturunkan. Kita tidak bisa membuat instance dari abstract class.
Abstract class adalah fitur dari TypeScript, tidak disupport oleh ES2015.
Untuk mendefinisikan suatu class adalah abstract, cukup menambahkan keyword abstract.
class ToDoStateChanger{
//code goes here
}
Jika Anda coba membuat instance baru dengan perintah var x = new ToDoStateChanger(), TypeScript akan menampilkan error.
var x = new ToDoStateChanger()
Cannot create an instance of an abstract class.
Selain pada level class, abstract juga dapat didefinisikan pada level method dari class tersebut. Artinya, saat melakukan inheritance, class turunan wajib membuat implementasi dari method tersebut.
Contoh mengubah method canChangeState menjadi abstract.
abstract class ToDoStateChanger{
abstract canChangeState(todo: Todo):boolean{
return !!todo;
}
//code goes here....
}
Contoh menggunakan class inheritance dari modul sebelumnya, kita akan ubah class ToDoStateChanger menjadi abstract class.
enum TodoState{
New = 0,
Active,
Complete,
Deleted
}
interface Todo{
name: string;
state: TodoState;
}
class ToDoStateChanger{
constructor(private newState: TodoState){
}
canChangeState(todo: Todo):boolean{
return !!todo;
}
changeState(todo: Todo): Todo{
if (this.canChangeState(todo)){
todo.state = this.newState;
}
return todo;
}
}
class CompleteToDoStateChanger extends ToDoStateChanger{
constructor(){
super(TodoState.Complete);
}
canChangeState(todo: Todo) : boolean{
return super.canChangeState(todo) && (
todo.state == TodoState.Active || todo.state == TodoState.Deleted
)
}
}
Setelah diubah mengubah class ToDoStateChange dan method canChangeState menjadi abstract.
Perhatikan abstract method tidak memerlukan implementasi. Sementara pada class turunan, wajib dibuat implementasinya.
enum TodoState{
New = 0,
Active,
Complete,
Deleted
}
interface Todo{
name: string;
state: TodoState;
}
abstract class ToDoStateChanger{
constructor(private newState: TodoState){
}
abstract canChangeState(todo: Todo):boolean;
changeState(todo: Todo): Todo{
if (this.canChangeState(todo)){
todo.state = this.newState;
}
return todo;
}
}
class CompleteToDoStateChanger extends ToDoStateChanger{
constructor(){
super(TodoState.Complete);
}
canChangeState(todo: Todo) : boolean{
return !!todo && (
todo.state == TodoState.Active || todo.state == TodoState.Deleted
)
}
}
Perhatian, bila sudah dicompile menjadi JavaScript, restriction membuat instance dari abstract tidak dapat dideteksi. Karena seperti yang sudah dibahas pada awal modul, abstract adalah fitur dari TypeScript, bukan ES2015.