Dart - 12. Interface, Casting, Mixins


Interface

Pada pemrograman dart, konsep pewarisan hanya memperbolehkan pewarisan tunggal (single inheritance), maksudnya kita hanya bisa meng-extends 1 kelas superclass ke subclass, akan tetapi, Dart mempunyai beberapa cara untuk memasukkan beberapa atribut dari beberapa kelas-kelas ke sebuah kelas yang baru, salah satunya adalah dengan keyword implements, keyword implements digunakan utuk memberitahu bahwa sebuah kelas mengimplementasikan interface dari kelas lainnya, apa maksud dari interface sebuah kelas? maksudnya adalah kombinasi dari nama accessor dan penandanya (sebuah metode yang mengembalikan int berbeda dengan mengembalikan string walaupun namanya sama), termasuk metode-metode, variabel dan properti dari suatu kelas.

Setiap class dalam pemrograman Dart meng-ekspos interfacenya untuk dapat digunakan kembali, ini termasuk juga kelas abstrak. Oleh karena itu, kelas apapun dapat mengimplemen interface kelas manapun. Sebuah kelas dapat mengimplement interfaces lebih dari satu. Persyaratan sebuah kelas dapat mengimplement interface kelas lainnya adalah harus mengimplementkan secara menyeluruh. Setiap metode, property, dan variabel instans yang dideklarasikan dikelas asal harus diimplement di kelas yang mengimplementasikan interfacenya. Perhatikan contoh berikut:


class A {
  void hello() {
    print("Class A Hello");
  }
}

class B {
  void horas() {
    print("Class B Horas");
  }
}

class C implements A,B {
  void hello() {
    print("Class C Hello");
  }
  
  void horas() {
    print("Class C Horas");
  }
}

class D extends B implements A {
  // harus diimplementasikan
  void hello() {
    print("Class D Hello");
  }
}

void main() {
  // jika diperhatikan kita tidak menciptakan objek dari kelas A
  // walalpun kita membuat variabel c dari A
  A c = C();
  c.hello(); // mencetak Class C Hello
  c.horas(); // error: karena kita mendeklarasikan c dengan kelas A, sementara metode horas ada di kelas B
  
  D d = D();
  d.horas(); // mencetak Class B Horas, karena ini adalah metode yang diwariskan dari kelas B
  d.hello(); // mencetak Class D Hello
}

Casting

Casting adalah cara memandang objek dari satu tipe tertentu seperti object dari tipe lainya dengan interface yang kompatibel. Jika kita perhatikan pada contoh sebelumnya, c.horas() akan menghasilkan error, karena c dideklarasikan dengan kelas A, dan A tidak memimiliki metode horas(), bagaimanapun, c diciptakan (instans) sebagai object dari kelas C, yang juga mempunyai metode horas().


A c = C(); // mendefenisikan c dari kelas A, menciptakan object c dari kelas C

Jika kita ingin memanggil metode horas() pada kelas C, kita dapat melakukannya dengan casting. Pada pemrograman Dart operator "as" digunakan untuk melakukan casting. perhatikan contoh berikut:

(c as C).horas(); // mencetak Class C Horas

Casting tersebut seolah-olah kita memberi perintah bahwa c adalah defenisi dari kelas C dan bukan kelas A, sehingga kita bisa memanggil metode yang terdapat pada kelas C tersebut.

void main() {
  // jika diperhatikan kita tidak menciptakan objek dari kelas A
  // walalpun kita membuat variabel c dari A
  A c = C();
  c.hello(); // mencetak Class C Hello
  (c as C).horas(); mencetak Class C Horas
  
  D d = D();
  d.horas(); // mencetak Class B Horas, karena ini adalah metode yang diwariskan dari kelas B
  d.hello(); // mencetak Class D Hello
}

Mixin

Mixin adalah cara lainnya untuk memberikan atribut dari suatu kelas ke kelas lainnya tanpa harus menggunakan pewarisan. Tidak seperti kelas yang mengimplementasikan interfaces, kelas yang menggunakan mixins tidak perlu mendefenisikan ulang metode yang terdapat pada kelas asalnya, untuk menggunakan mixins pada pemrograman Dart digunakan keyword "with".

Hal yang perlu diperhatikan pada saat membuat kelas menjadi mixin adalah:

  • Tidak boleh ada deklarasi konstruktor
  • Bukan merupakan subclass dari kelaslainnya selain Object (tidak boleh menerima pewarisan)
  • Tidak boleh memanggil metode menggunakan keyword "super".

Untuk melihat cara kerja mixin, perhatikan contoh berikut ini, kelas yang akan dijadikan mixin adalah Waktu, dan harus diingat sayarat untuk menjadikan class sebagai penyedia mixin.

// penyedia mixin.
class Waktu {
  DateTime sekarang = DateTime.now();
  
  void cetakWaktuSekarang() {
    print(sekarang);
  }
}

abstract class Kue {
  String nama;
  Kue(this.nama);
}

class Bolu extends Kue with Waktu {
  Bolu(String nama) : super(nama);
}

class Donat extends Kue {
  Donat(String name) : super(name);
}

class Martabak with Waktu {
}

void main() {
  Bolu bl = Bolu("Bolu Pisang");
  Donat dn = Donat("Donat Kentang");
  bl.cetakWaktuSekarang();
  Martabak mb = Martabak();
  mb.cetakWawktuSekarang();
}

Jika kita perhatikan, kelas Waktu seolah-olah meminjamkan metodenya untuk digunakan, jadi kita tidak perlu melakukan pewarisan ataupun implementasi ulang metodenya, kita dapat menggunakan metode yang terdapat pada kelas penyedia mixin secara langsung.
Dart - 12. Interface, Casting, Mixins Dart - 12. Interface, Casting, Mixins Reviewed by jc on July 09, 2019 Rating: 5

No comments:

Powered by Blogger.