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 berhasilDowncasting 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.
Tantangan
MudahMari 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 dasarVehicledalam namespaceInspection. Setiap kendaraan memiliki propertyLicensePlate(string) yang diatur melalui constructor. Sertakan method bernamaGetBasicInfo()yang mengembalikan"Vehicle: {LicensePlate}".Car.cs: Definisikan classCardalam namespaceInspectionyang mewarisiVehicle. Mobil memiliki property tambahanNumberOfDoors(int). Constructor menerima nomor pelat dan jumlah pintu. Tambahkan method bernamaHonk()yang mengembalikan"{LicensePlate} honks: Beep beep!".Motorcycle.cs: Definisikan classMotorcycledalam namespaceInspectionyang mewarisiVehicle. Sepeda motor memiliki propertyHasSidecar(bool). Constructor menerima nomor pelat dan status sidecar. Tambahkan method bernamaRev()yang mengembalikan"{LicensePlate} revs: Vroom!".Program.cs: Dalam file utama, kamu akan membuat kendaraan dan berlatih melakukan upcasting serta downcasting dengan aman. BuatCardanMotorcyclemenggunakan nilai input, lalu simpan keduanya dalam array berisi referensiVehicle(upcasting). Lakukan perulangan pada array dan cetak informasi dasar setiap kendaraan. Kemudian, gunakan kata kunciisdengan pattern matching untuk melakukan downcasting dengan aman: jika jenisnyaCar, panggilHonk(); jika jenisnyaMotorcycle, panggilRev().
Kamu akan menerima empat input:
- Nomor pelat mobil
- Jumlah pintu
- Nomor pelat sepeda motor
- Memiliki sidecar (
trueataufalse)
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()
}
}
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