Menu
CoddyTech

Upcasting & Downcasting

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

Saat bekerja dengan hierarki pewarisan, kamu sering perlu mengonversi antara tipe dasar dan tipe turunan. Upcasting mengonversi tipe turunan menjadi tipe dasarnya, sedangkan downcasting melakukan hal sebaliknya.

Upcasting dilakukan secara implisit dan selalu aman karena class turunan dijamin memiliki semua yang dimiliki class dasar:

Dog myDog = new Dog();
Animal animal = myDog;  // Upcasting: implisit, selalu berhasil

Downcasting memerlukan cast eksplisit dan dapat gagal saat runtime jika object sebenarnya bukan tipe yang kamu jadikan tujuan cast:

Animal animal = new Dog();
Dog dog = (Dog)animal;  // Downcasting berhasil karena sebenarnya ini adalah Dog

Animal cat = new Cat();
Dog wrong = (Dog)cat;   // Melempar InvalidCastException!

Untuk melakukan downcast dengan aman, gunakan kata kunci is untuk memeriksa tipe terlebih dahulu, atau gunakan as yang mengembalikan null alih-alih melempar exception:

if (animal is Dog d)
{
    d.Bark();  // Aman, d hanya tersedia jika pemeriksaan berhasil
}

Dog maybeDog = animal as Dog;
if (maybeDog != null)
{
    maybeDog.Bark();
}

Pendekatan pencocokan pola is lebih disukai di C# modern karena menggabungkan pemeriksaan tipe dan cast dalam satu langkah, sehingga kodemu lebih aman dan rapi.

challenge icon

Tantangan

Mudah

Mari bangun sistem inspeksi kendaraan yang menunjukkan cara upcasting dan downcasting memungkinkan kamu bekerja secara fleksibel dengan object dalam hierarki pewarisan. Kamu akan membuat berbagai jenis kendaraan dan menulis kode yang dapat mengidentifikasi serta berinteraksi dengan jenis kendaraan tertentu dengan aman.

Kamu akan menyusun kodemu dalam empat file:

  • Vehicle.cs: Definisikan class dasar Vehicle dalam namespace Inspection. Setiap kendaraan memiliki property LicensePlate (string) yang diatur melalui constructor. Sertakan method bernama GetBasicInfo() yang mengembalikan "Vehicle: {LicensePlate}".
  • Car.cs: Definisikan class Car dalam namespace Inspection yang mewarisi Vehicle. Mobil memiliki property tambahan NumberOfDoors (int). Constructor menerima nomor pelat dan jumlah pintu. Tambahkan method bernama Honk() yang mengembalikan "{LicensePlate} honks: Beep beep!".
  • Motorcycle.cs: Definisikan class Motorcycle dalam namespace Inspection yang mewarisi Vehicle. Sepeda motor memiliki property HasSidecar (bool). Constructor menerima nomor pelat dan status sidecar. Tambahkan method bernama Rev() yang mengembalikan "{LicensePlate} revs: Vroom!".
  • Program.cs: Dalam file utama, kamu akan membuat kendaraan dan berlatih melakukan upcasting serta downcasting dengan aman. Buat Car dan Motorcycle menggunakan nilai input, lalu simpan keduanya dalam array berisi referensi Vehicle (upcasting). Lakukan perulangan pada array dan cetak informasi dasar setiap kendaraan. Kemudian, gunakan kata kunci is dengan pattern matching untuk melakukan downcasting dengan aman: jika jenisnya Car, panggil Honk(); jika jenisnya Motorcycle, panggil Rev().

Kamu akan menerima empat input:

  • Nomor pelat mobil
  • Jumlah pintu
  • Nomor pelat sepeda motor
  • Memiliki sidecar (true atau false)

Cetak output dengan format berikut untuk setiap kendaraan dalam array:

{GetBasicInfo() result}
{Honk() or Rev() result based on actual type}

Misalnya, jika inputnya adalah ABC-123, 4, XYZ-789, dan false, outputnya seharusnya:

Vehicle: ABC-123
ABC-123 honks: Beep beep!
Vehicle: XYZ-789
XYZ-789 revs: Vroom!

Perhatikan bahwa semua kendaraan disimpan sebagai referensi Vehicle (upcasting), tetapi kamu tetap dapat mengetahui tipe aslinya dengan aman dan mengakses method khusus untuk tipe tersebut menggunakan sintaks pattern matching is untuk downcasting!

Coba sendiri

using System;
using Inspection;

class Program
{
    public static void Main(string[] args)
    {
        // Baca input
        string carPlate = Console.ReadLine();
        int numberOfDoors = Convert.ToInt32(Console.ReadLine());
        string motorcyclePlate = Console.ReadLine();
        bool hasSidecar = Convert.ToBoolean(Console.ReadLine());
        
        // TODO: Buat object Car menggunakan carPlate dan numberOfDoors
        
        // TODO: Buat object Motorcycle menggunakan motorcyclePlate dan hasSidecar
        
        // TODO: Buat array referensi Vehicle yang berisi kedua kendaraan (upcasting)
        
        // TODO: Lakukan perulangan pada array dan untuk setiap kendaraan:
        //   - Cetak hasil GetBasicInfo()
        //   - Gunakan kata kunci 'is' dengan pencocokan pola untuk melakukan downcast dengan aman:
        //     - Jika kendaraannya Car, panggil dan cetak Honk()
        //     - Jika kendaraannya Motorcycle, panggil dan cetak Rev()
    }
}
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