Pewarisan dalam C#: Panduan Komprehensif untuk Pemula

Hai teman-teman yang sedang belajar pemrograman! Hari ini, kita akan memulai perjalanan menarik ke dunia pewarisan dalam C#. Jangan khawatir jika Anda baru belajar pemrograman - saya akan menjadi panduan Anda, dan kita akan mengexplore konsep ini secara berangsur-angsur. Pada akhir tutorial ini, Anda akan memiliki pengetahuan yang kuat tentang pewarisan dan bagaimana itu bisa membuat kode Anda lebih efisien dan terorganisir.

C# - Inheritance

Apa Itu Pewarisan?

Sebelum kita masuk ke detail, mari kita mulai dengan analogi sederhana. Bayangkan Anda membuat pohon keluarga. Setiap orang dalam pohon itu mewarisi beberapa ciri dari orang tua mereka, kan? Well, pewarisan dalam pemrograman bekerja dengan cara yang mirip!

Dalam C#, pewarisan adalah mekanisme yang memungkinkan kelas baru untuk didasarkan pada kelas yang sudah ada. Kelas baru ini mewarisi properti dan metode kelas yang sudah ada, sama seperti Anda mungkin mewarisi warna mata atau tinggi badan orang tua Anda.

Kelas Dasar dan Kelas Turunan

Dalam dunia pewarisan, kita memiliki dua pemain utama:

  1. Kelas Dasar (juga disebut Parent atau Superclass): Ini adalah kelas asli yang menjadikan properti dan metode umum.
  2. Kelas Turunan (juga disebut Child atau Subclass): Ini adalah kelas baru yang mewarisi dari kelas dasar.

Mari kita lihat contoh sederhana:

// Kelas dasar
public class Animal
{
public string Name { get; set; }
public int Age { get; set; }

public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}

// Kelas turunan
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}

Dalam contoh ini, Animal adalah kelas dasar, dan Dog adalah kelas turunan. Bagian : Animal dalam deklarasi kelas Dog adalah cara kita mengatakan ke C# bahwa Dog mewarisi dari Animal.

Sekarang, mari kita lihat bagaimana kita bisa menggunakan kelas ini:

Dog myDog = new Dog();
myDog.Name = "Buddy";
myDog.Age = 3;

myDog.Eat();  // Mewarisi dari Animal
myDog.Bark(); // Didefinisikan di Dog

Ketika kita menjalankan kode ini, kita akan melihat:

Buddy is eating.
Buddy says Woof!

Apakah itu menarik? Kelas Dog kita memiliki akses ke properti Name dan Age, serta metode Eat() dari kelas Animal, tanpa kita harus menulis semua kode itu lagi!

Inisialisasi Kelas Dasar

Sekarang, Anda mungkin bertanya-tanya, "Apa bila saya ingin menyetel nilai awal untuk kelas dasar saat saya membuat objek kelas turunan?" Pertanyaan bagus! Ini adalah tempat kontruktur masuk ke dalam gambar.

Mari kita modifikasi contoh kita:

public class Animal
{
public string Name { get; set; }
public int Age { get; set; }

public Animal(string name, int age)
{
Name = name;
Age = age;
}

public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}

public class Dog : Animal
{
public Dog(string name, int age) : base(name, age)
{
// Inisialisasi tambahan untuk Dog, jika diperlukan
}

public void Bark()
{
Console.WriteLine($"{Name} says Woof!");
}
}

Dalam versi ini, kita menambahkan kontruktur ke kelas Animal. Konuktur kelas Dog menggunakan sintaks : base(name, age) untuk memanggil konuktur kelas dasar dan mengirimkan parameter name dan age.

Sekarang kita bisa membuat objek Dog seperti ini:

Dog myDog = new Dog("Buddy", 3);
myDog.Eat();
myDog.Bark();

Ini akan menghasilkan output yang sama seperti sebelumnya, tapi sekarang kita menginisialisasi properti Name dan Age saat kita membuat objek Dog.

Pewarisan Ganda dalam C

Sekarang, mari kita masukkan twist: tidak seperti beberapa bahasa pemrograman lainnya, C# tidak mendukung pewarisan ganda untuk kelas. Ini berarti kelas tidak bisa mewarisi langsung dari lebih dari satu kelas dasar.

Tapi jangan khawatir! C# memiliki solusi cerdik menggunakan interface. Interface adalah seperti kontrak yang menentukan apa yang harus dilakukan kelas, tanpa menentukan bagaimana itu harus dilakukan.

Mari kita lihat contoh:

public interface ISwimmable
{
void Swim();
}

public interface IFlyable
{
void Fly();
}

public class Bird : Animal, IFlyable
{
public Bird(string name, int age) : base(name, age) { }

public void Fly()
{
Console.WriteLine($"{Name} is flying.");
}
}

public class Fish : Animal, ISwimmable
{
public Fish(string name, int age) : base(name, age) { }

public void Swim()
{
Console.WriteLine($"{Name} is swimming.");
}
}

public class Duck : Animal, ISwimmable, IFlyable
{
public Duck(string name, int age) : base(name, age) { }

public void Swim()
{
Console.WriteLine($"{Name} is swimming.");
}

public void Fly()
{
Console.WriteLine($"{Name} is flying.");
}
}

Dalam contoh ini, kita membuat dua interface: ISwimmable dan IFlyable. Kelas Bird mewarisi dari Animal dan mengimplmentasi IFlyable. Kelas Fish mewarisi dari Animal dan mengimplmentasi ISwimmable. Dan lihat kelas Duck kita - itu mewarisi dari Animal dan mengimplmentasi ISwimmable dan IFlyable!

Mari kita gunakan kelas ini:

Bird myBird = new Bird("Tweety", 2);
myBird.Fly();

Fish myFish = new Fish("Nemo", 1);
myFish.Swim();

Duck myDuck = new Duck("Donald", 5);
myDuck.Swim();
myDuck.Fly();

Ini akan menghasilkan output:

Tweety is flying.
Nemo is swimming.
Donald is swimming.
Donald is flying.

Apakah itu menakjubkan? Kelas Duck kita bisa berenang dan terbang, meskipun C# tidak mendukung pewarisan ganda untuk kelas!

Tabel Metode

Ini adalah tabel yang menggabungkan metode yang kita gunakan dalam contoh kita:

Kelas/Interface Metode Deskripsi
Animal Eat() Mencetak pesan bahwa hewan sedang makan
Dog Bark() Mencetak pesan bahwa anjing sedang menggonggong
ISwimmable Swim() Menentukan metode untuk berenang
IFlyable Fly() Menentukan metode untuk terbang
Bird Fly() Mengimplentasi metode Fly
Fish Swim() Mengimplentasi metode Swim
Duck Swim(), Fly() Mengimplentasi kedua metode Swim dan Fly

Dan itu saja! Kita telah meliputi dasar pewarisan dalam C#, dari kelas dasar dan turunan sederhana hingga kasus yang lebih kompleks menggunakan interface. Ingat, pewarisan tentang penggunaan kode dan membuat hubungan logis antara kelas. Ini adalah alat yang kuat yang bisa membuat kode Anda lebih efisien dan mudah untuk dikelola.

Sekarang, saat Anda terus melanjutkan perjalanan pemrograman Anda, Anda akan menemukan banyak cara untuk menggunakan pewarisan untuk memecahkan masalah yang kompleks. Tetap latihan, dan jangan takut untuk mencoba konsep ini. Selamat coding!

Credits: Image by storyset