Subbab 4 / 9

Polymorphism

Pengertian

Polimorfisme adalah salah satu pilar utama dalam Pemrograman Berorientasi Objek (OOP). Secara etimologi, polimorfisme berasal dari bahasa Yunani: poly (banyak) dan morph (bentuk). Dalam dunia pemrograman, ini berarti satu antarmuka atau metode dapat memiliki banyak implementasi yang berbeda.


ANALOGI

Bayangkan beberapa hewan sama-sama diminta untuk bersuara.

  1. Kucing akan merespons dengan “Meong”.
  2. Anjing akan merespons dengan “Guk guk”.
  3. Burung akan merespons dengan “Cuit cuit”.

Perintahnya sama, tetapi setiap hewan memberikan respons yang berbeda sesuai jenisnya.

Inilah konsep polymorphism: satu aksi yang sama dapat menghasilkan perilaku berbeda pada objek yang berbeda.


Jenis-jenis Polymorphism dalam C#

Dalam C#, polimorfisme dibagi menjadi dua kategori utama:

1. Overloading (Polimorfisme Statis)

Overloading ibarat satu orang yang punya banyak skill. Namanya tetap sama, tapi inputnya beda. Hal ini terjadi di dalam satu kelas yang sama.

Contoh sederhana:

  • Metode Tambah(int a, int b)
  • Metode Tambah(double a, double b)

Contoh: Method Bayar

  • Kamu bayar pakai Uang Pas* (1 parameter).
  • Kamu bayar pakai Uang Pecahan* (2 parameter atau lebih).
  • Kamu bayar pakai Kartu Kredit* (tipe datanya beda, pakai string nomor kartu).


csharp
1
2
3
4
5
6
7
8
9
10
11
public class Kasir {
    // Bayar pakai cash (angka bulat)
    public void Bayar(int jumlah) {
        Console.WriteLine("Bayar tunai sebesar: " + jumlah);
    }

    // Bayar pakai kartu (teks)
    public void Bayar(string nomorKartu) {
        Console.WriteLine("Bayar pakai kartu: " + nomorKartu);
    }
}

2.Overriding (Polimorfisme Dinamis)

Ini terjadi saat program sedang berjalan. Ini melibatkan penggunaan Inheritance (pewarisan) dan Method Overriding. Di sini, kelas turunan memberikan implementasi spesifik untuk metode yang sudah didefinisikan di kelas induk.

Implementasi Kode C#

csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// Kelas Induk (Base Class)

public class Hewan
{
    // Keyword 'virtual' mengizinkan metode ini diubah oleh kelas turunan

    public virtual void Suara()
    {
        Console.WriteLine("Hewan mengeluarkan suara");

    }
}

// Kelas Turunan (Derived Class)

public class Anjing : Hewan
{
    // Keyword 'override' digunakan untuk mengganti perilaku metode induk

    public override void Suara()
    {
        Console.WriteLine("Anjing menggonggong: Guk Guk!");
    }

}

public class Kucing : Hewan
{

    public override void Suara()
    {
        Console.WriteLine("Kucing mengeong: Meong!");
    }

}

Cara Penggunaannya:

csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Program
{
    public static void Main()
    {
        // Polimorfisme: Tipe data Hewan, tetapi instansiasi spesifik
        Hewan peliharaan1 = new Anjing();

        Hewan peliharaan2 = new Kucing();

        peliharaan1.Suara(); // Output: Anjing menggonggong

        peliharaan2.Suara(); // Output: Kucing mengeong

    }

}

Perbedaan Overloading dan Overriding

Aspek

Overloading

Overriding

Parameter

Harus berbeda (tipe data / jumlah parameter)

Harus sama

Return Type

Boleh sama atau berbeda

Harus sama

Fleksibiltas

Menangani input yang berbeda dalam satu Method

Mengubah perilaku bawaan dari superclass


Manfaat Polymorphism

  • Fleksibilitas:

Polimorfisme memungkinkan objek berperilaku seolah-olah termasuk dalam kelas yang berbeda, sehingga kode menjadi lebih mudah beradaptasi. Hal ini sangat bermanfaat dalam sistem yang besar dan kompleks, di mana transisi yang mulus antara berbagai tipe objek meningkatkan fleksibilitas sistem secara keseluruhan.

  • Kemampuan penggunaan kembali:

Polimorfisme memfasilitasi penggunaan kembali kode dengan memungkinkan satu antarmuka atau metode superkelas untuk diimplementasikan dalam berbagai cara oleh berbagai subkelas. Hal ini meningkatkan kemampuan penggunaan kembali kode di berbagai skenario.

  • Kemudahan Pemeliharaan dan Skalabilitas:

Sistem yang menggunakan polimorfisme membutuhkan lebih sedikit perubahan kode ketika kelas baru ditambahkan atau kelas yang sudah ada dimodifikasi. Hal ini menyederhanakan pemeliharaan perangkat lunak dan mempermudah perluasan di masa mendatang.

  • Kemudahan pemahaman:

Dengan memungkinkan pengembangan modular, polimorfisme membuat kode lebih mudah dipahami. Metode yang melakukan tugas yang sama dapat diimplementasikan secara berbeda di berbagai kelas, memastikan setiap kelas tetap mandiri dan mudah dikelola.