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 doubleKompiler 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 berjalanCompiler 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.
Tantangan
MudahMari 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 classConverterdi namespaceConversion. Class ini menunjukkan polimorfisme saat kompilasi melalui method overloading. Buat tiga methodConvertyang di-overload:Convert(int value)mengembalikan"Integer: {value}"Convert(double value)mengembalikan"Double: {value}"Convert(string value)mengembalikan"String: {value}"
Shape.cs: Definisikan class dasarShapedi namespaceConversion. Class ini memiliki propertyName(string) dan konstruktor yang menetapkan nilainya. Sertakan methodvirtualbernamaDescribe()yang mengembalikan"This is a {Name}".Circle.cs: Definisikan classCircledi namespaceConversionyang mewarisiShape. Tambahkan propertyRadius(double). Konstruktor menerima radius dan meneruskan"Circle"ke konstruktor dasar. OverrideDescribe()agar mengembalikan"This is a Circle with radius {Radius}".Program.cs: Di file utama, tunjukkan kedua jenis polimorfisme. Pertama, buatConverterdan panggil ketiga method yang di-overload dengan nilai input. Lalu buatCircle, simpan dalam variabelShape, dan panggilDescribe()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.5Perhatikan 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()
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online