Menggunakan Class Inheritance

Class inheritance adalah menurunkan class. Untuk menurunkan class, digunakan keyword extends.

Class inheritance sendiri merupakan fitur dari ES2015, yang dapat kita implementasikan melalui TypeScript.

Misalnya kita memiliki class ToDoStateChanger, kemudian hendak dibuat class baru untuk khusus mengatur state complete.

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

Berikut contoh penurunannya.

Ketika menurunkan class yang memiliki constructor dengan parameter, tidak diwajibkan membuat constructor.

Jika Anda ingin membuat constructor , maka harus memanggil constructor dari based class dengan menggunakan keyword super().

class CompleteToDoStateChanger extends ToDoStateChanger{
    constructor(){
        super(TodoState.Complete);
    }
}

Misalnya, kita akan mengubah method canChangeState dari based class, tidak diperlukan keyword khusus, Anda bisa langsung menuliskan nama method yang sama dengan implementasi yang berbeda.

Berikut contoh mengubah method canChangeState dengan menambahkan kriteria dimana state dapat diubah jika state adalah Active atau Deleted.

    canChangeState(todo: Todo) : boolean{
        return !!todo && (
            todo.state == TodoState.Active || todo.state == TodoState.Deleted
        )
    }

Karena kita akan menggunakan implementasi yang sama dari based class yaitu return !!todo, kita dapat menggunakan method based class yang diakses melalui keyword super.

    canChangeState(todo: Todo) : boolean{
        return super.canChangeState(todo) && (
            todo.state == TodoState.Active || todo.state == TodoState.Deleted
        )
    }

Berikut isi code lengkap contoh class inheritance

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
        )
    }
}
Sharing is caring:

Leave a Comment