/* Incheritance (pewarisan) adalah sebuah solusi yang bisa digunakan utk
mempermudah dalam membuat membuat properti dan method.
contoh class yang memiliki properti dan method serupa adalah
pesawat, mobil dan motor.
didalam body class ketiga nya memiliki manufacture, info() dan color().
Jika tanpa inheritance, setiap kali kita membuat class baru, maka kita akan
mebuat manufactrue, info() dan color secara berulang yang diamana itu akan
membuat pekerjaan kita jadi lebih lama, tapi dgn Inheritance kita bisa mncegah
melakukan perulangan kode dan mengelompokkan properti dan method yang sama.
Caranya dengan membuat sebuah class induk atau class baru yang nantinya
akan diturunkan sifatnya pada class anak
JavaScript jika kita ingin mewariskan sifat class,
lakukan dengan keyword extends seperti berikut:
class ChildClass extends ParentClass {
}
Sebagai contoh mari kita buat class Vehicle yang nantinya akan kita gunakan
sebagai parent class atau class induk :
*/
class Vehicle{
constructor(licensePlate, manufacture){
this.licensePlate = licensePlate;
this.manufacture = manufacture;
this.engineActive = false;
}
// menambahkan method
startEngines(){
console.log(`Mesin ${this.manufacture} ${this.licensePlate} dinyalakan!`)
}
info(){
console.log(`Nomor Kendaraan: ${this.licensePlate}`);
console.log(`Manufacture: ${this.manufacture}`);
console.log(`Mesin: ${this.engineActive? "Active" : "Inactive"}`);
}
parking(){
console.log(`Kendaraan ${this.licensePlate}`);
}
}
//Kemudian kita bisa membuat class Car sebagai class anak dari class Vehicle
/* JavaScript jika kita ingin mewariskan sifat class, lakukan dengan keyword extends
arti dibawah : class Car sebagai class anak mewairisi
class Vehicle sbg class induk */
class Car extends Vehicle{
constructor(licensePlate, manufacture, wheels){
super(licensePlate, manufacture);
this.wheels = wheels;
}
/* Keyword super pada constructor diats digunakan untuk mengakses properti
dan method yang ada pada induk class ketika berada pada class anak
Jadi super(lisencePlate, manufacture) di atas berarti kita mengakses
constructor dari parent class dan mengirimkan lisencePlate,
dan manufacture sebagai data yang dibutuhkan olehnya agar objek (instance) Car
berhasil dibuat.*/
// membuat method
driveOff(){
console.log(`Kendaraan ${this.licensePlate}`);
}
// membuat method
openDoor(){
console.log(`Membuka pintu!`);
}
/* Method Overriding dilakukan saat kita ingin membuat ulang sebuah
method pada sub-class atau class anak.
Untuk melakukan method overriding, kita tambahkan super diikuti dot didepan
method class induk nya.
Dibawah ini kita akan melakukan method overriding pada method info()
dengan menambahkan informasi jumlah roda pada mobil */
info(){
super.info();
console.log(`Jumlah roda: ${this.wheels}`);
}
}
/* Dengan begitu selain properti dan method yang terdapat di dalamnya,
class Car juga dapat mengakses seluruh properti dan method yang terdapat
pada class Vehicle. */
/* Static Method
Dalam dunia nyata, sebuah kendaraan memerlukan perawatan atau perbaikan apabila
terjadi kerusakan dan perawatan atau perbaikan kendaraan biasanya dilakukan
di bengkel (factory). Maka dari itu, seklanjutnya kita akan membuat bengkel
(class VehicleFactory) dan mengisinya dengan method repair() :
*/
class VehicleFactory{
repair(vehicle){
vehicle.forEach(vehicle=>{
console.log(`Kendaraan ${vehicle.licensePlate} sedang diperbaiki`);
});
}
/* agar method atau fungsi dari class dibawah ini bisa langusng diakses
tanpa membuat inheritance, kita bisa menggunakan static method dengan
cara menambahkan static keyword sebelum deklarasi method-nya seperti
dibawah ini */
static perbaiki(vehicle){
vehicle.forEach(vehicle=>{
console.log(`Kendaraan ${vehicle.licensePlate} sedang diperbaiki`);
});
}
}
function br(){
console.log("");
}
//membuat objek dari class Car
const wulingCar = new Car("Cortez", "Wuling", 4);
const toyotaCar = new Car("Fortuner", "Toyota", 4);
wulingCar.startEngines();
wulingCar.info();
br();
toyotaCar.startEngines();
toyotaCar.info();
/* Seandaa nya kita tidak melakukan method overriding pada method info(),
maka info yang akan ditampilkan hanya berupa:
Nomor Kendaraan: Cortez
Manufacture: Wuling
Mesin Inactive
Informasi mengenai jumlah roda tidak ditampilkan*/
// membuat instance untuk mengakses
//method repair() dari class VehicleFactory
const vehicleFactory = new VehicleFactory();
br();
vehicleFactory.repair([wulingCar, toyotaCar]);
// memanggil method secara langsung dari class VehicleRepair tanpa membuat
// inheritance menggunakan static method
br();
VehicleFactory.perbaiki([wulingCar, toyotaCar]);