Menu
CoddyTech

Polimorfisme saat kompilasi vs runtime

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 25 dari 70.

Polimorfisme berarti "banyak bentuk", yaitu kemampuan kode yang sama untuk berperilaku berbeda bergantung pada konteks. C# mendukung dua jenis polimorfisme yang berbeda, dan memahami kapan masing-masing ditentukan akan membantumu menulis kode yang lebih fleksibel.

Polimorfisme saat kompilasi (juga disebut polimorfisme statis) ditentukan oleh compiler sebelum programmu berjalan. Method overloading adalah contoh utamanya, beberapa method memiliki nama yang sama, tetapi parameter yang berbeda:

public class Calculator
{
    public int Add(int a, int b) => a + b;
    public double Add(double a, double b) => a + b;
}

var calc = new Calculator();
calc.Add(5, 3);       // Compiler memilih versi int
calc.Add(5.0, 3.0);   // Compiler memilih versi double

Kompiler memeriksa tipe argumen dan memilih method yang tepat saat kompilasi. Keputusan ini ditetapkan sebelum program dijalankan.

Polimorfisme saat runtime (polimorfisme dinamis) ditentukan saat program dijalankan. Ini terjadi pada method virtual dan override, tipe sebenarnya dari object menentukan method mana yang dijalankan:

Animal pet = new Dog();  // Dideklarasikan sebagai Animal, tetapi sebenarnya Dog
pet.Speak();             // Memanggil Speak() milik Dog saat program berjalan

Compiler tidak tahu Speak() mana yang akan dijalankan. Keputusan itu terjadi saat runtime berdasarkan tipe sebenarnya dari object. Inilah yang membuat polimorfisme berbasis pewarisan begitu ampuh untuk membangun sistem yang fleksibel dan mudah dikembangkan.

challenge icon

Tantangan

Mudah

Mari kita buat sistem konverter yang menunjukkan kedua jenis polimorfisme dalam penerapannya. Kamu akan membuat class yang menggunakan method overloading (polimorfisme saat kompilasi), bersama hierarki pewarisan yang menggunakan method virtual/override (polimorfisme saat runtime).

Kamu akan menyusun kodemu dalam empat file:

  • Converter.cs: Definisikan class Converter di namespace Conversion. Class ini menunjukkan polimorfisme saat kompilasi melalui method overloading. Buat tiga method Convert yang di-overload:
    • Convert(int value) mengembalikan "Integer: {value}"
    • Convert(double value) mengembalikan "Double: {value}"
    • Convert(string value) mengembalikan "String: {value}"
  • Shape.cs: Definisikan class dasar Shape di namespace Conversion. Class ini memiliki property Name (string) dan konstruktor yang menetapkan nilainya. Sertakan method virtual bernama Describe() yang mengembalikan "This is a {Name}".
  • Circle.cs: Definisikan class Circle di namespace Conversion yang mewarisi Shape. Tambahkan property Radius (double). Konstruktor menerima radius dan meneruskan "Circle" ke konstruktor dasar. Override Describe() agar mengembalikan "This is a Circle with radius {Radius}".
  • Program.cs: Di file utama, tunjukkan kedua jenis polimorfisme. Pertama, buat Converter dan panggil ketiga method yang di-overload dengan nilai input. Lalu buat Circle, simpan dalam variabel Shape, dan panggil Describe() untuk menunjukkan polimorfisme saat runtime.

Kamu akan menerima empat input:

  • Nilai integer
  • Nilai double
  • Nilai string
  • Radius lingkaran (double)

Cetak output dengan format berikut:

Compile-time Polymorphism:
{Convert(int) result}
{Convert(double) result}
{Convert(string) result}
Runtime Polymorphism:
{Describe() result from Shape variable holding Circle}

Contohnya, jika inputnya adalah 42, 3.14, Hello, dan 5.5, outputnya akan seperti berikut:

Compile-time Polymorphism:
Integer: 42
Double: 3.14
String: Hello
Runtime Polymorphism:
This is a Circle with radius 5.5

Perhatikan perbedaan utamanya: compiler menentukan method Convert mana yang akan dipanggil berdasarkan tipe argumen saat kompilasi, sedangkan method Describe() ditentukan saat runtime berdasarkan tipe object yang sebenarnya, meskipun object tersebut disimpan dalam variabel Shape!

Coba sendiri

using System;
using Conversion;

class Program
{
    public static void Main(string[] args)
    {
        // Baca input
        int intValue = Convert.ToInt32(Console.ReadLine());
        double doubleValue = Convert.ToDouble(Console.ReadLine());
        string stringValue = Console.ReadLine();
        double radius = Convert.ToDouble(Console.ReadLine());

        // TODO: Tunjukkan polimorfisme saat kompilasi
        // Buat object Converter dan panggil ketiga method Convert yang kelebihan beban
        Console.WriteLine("Compile-time Polymorphism:");
        // Panggil Convert dengan intValue, doubleValue, dan stringValue

        // TODO: Tunjukkan polimorfisme saat program berjalan
        // Buat object Circle dan simpan dalam variabel Shape
        // Lalu panggil Describe() melalui variabel Shape
        Console.WriteLine("Runtime Polymorphism:");
        // Buat Circle dan panggil Describe()
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler C# online