Memeriksa prinsip-prinsip pewarisan kelas

Selesai

Warisan adalah salah satu karakteristik utama pemrograman berorientasi objek. Ini memungkinkan Anda untuk membuat hierarki kelas dengan mendefinisikan hubungan antar kelas. Di C#, Anda dapat membuat kelas dasar yang menentukan perilaku dan karakteristik umum, lalu membuat kelas turunan yang mewarisi dan memperluas perilaku tersebut.

Misalnya, kelas dasar bernama Person mungkin menentukan properti Name dan Age. Kelas turunan bernama Employee mungkin mewarisi properti ini dan menentukan properti lain seperti EmployeeNumber dan Salary.

Contoh ini dapat diwakili menggunakan kode C# berikut:

public class Person
{
    public string? Name { get; set; }
    public int Age { get; set; }
}

public class Employee : Person
{
    public int EmployeeNumber { get; set; }
    public decimal Salary { get; set; }
}

Sampel kode ini mendefinisikan kelas Person lalu kelas Employee. Perhatikan karakter titik dua (:) dalam deklarasi kelas Employee. Titik dua (:) antara Employee dan Person menunjukkan bahwa kelas Employee mewarisi dari kelas Person. Dalam hal ini kelas Employee mewarisi properti Name dan Age dan menentukan dua properti lagi: EmployeeNumber dan Salary. Saat objek Employee dibuat, objek tersebut memiliki akses ke properti Name dan Age yang ditentukan di kelas Person, serta properti EmployeeNumber dan Salary yang ditentukan dalam kelas Employee. Saat objek Person dibuat, objek hanya memiliki akses ke properti Name dan Age.

Pewarisan memungkinkan Anda membuat hierarki kelas yang berbagi perilaku dan karakteristik umum. Ini memungkinkan Anda untuk menggunakan kembali kode dan menentukan hubungan antar kelas. Dengan menggunakan pewarisan, Anda dapat membuat kode yang lebih dapat dipertahankan dan dapat diperluas.

Manfaat warisan

Warisan memberikan beberapa manfaat, termasuk:

  • Penggunaan kembali kode: Pewarisan memungkinkan Anda menggunakan kembali kode yang ditentukan dalam kelas dasar di kelas turunan. Ini mengurangi duplikasi dan mempromosikan penggunaan kembali kode.
  • Ekstensibilitas: Pewarisan memungkinkan Anda memperluas perilaku kelas dasar dengan menambahkan anggota baru ke kelas turunan. Anda dapat menentukan properti, metode, dan peristiwa baru di kelas turunan.
  • Enkapulasi: Pewarisan mempromosikan enkapulasi dengan memungkinkan Anda menyembunyikan detail implementasi kelas dasar dari kelas turunan. Pewarisan dan enkapulasi memungkinkan Anda menentukan antarmuka yang jelas untuk berinteraksi dengan objek kelas turunan.
  • Konsistensi : Warisan mempromosikan konsistensi dengan memungkinkan Anda menentukan perilaku umum di kelas dasar. Mewarisi dari kelas dasar memastikan bahwa kelas turunan memiliki perilaku dasar yang sama.
  • Polimorfisme: Warisan memungkinkan polimorfisme, yang memungkinkan Anda memperlakukan objek kelas turunan sebagai objek kelas dasar mereka. Polimorfisme memungkinkan Anda menulis kode yang berfungsi dengan objek dari berbagai jenis tanpa mengetahui jenis spesifiknya pada waktu kompilasi.

Membandingkan pewarisan kelas dengan implementasi antarmuka

C# menyediakan dua mekanisme untuk menentukan hubungan antara kelas: pewarisan kelas dan implementasi antarmuka. Pewarisan kelas memungkinkan kelas untuk mewarisi anggota dari kelas dasar, sementara implementasi antarmuka memungkinkan kelas untuk mengimplementasikan anggota yang ditentukan dalam antarmuka. Kedua mekanisme memungkinkan penggunaan kembali kode dan mempromosikan polimorfisme, tetapi memiliki karakteristik yang berbeda:

Pewarisan kelas memiliki karakteristik berikut:

  • Kelas hanya dapat mewarisi dari satu kelas dasar.
  • Kelas turunan dapat menggunakan kembali, memperluas, dan memodifikasi perilaku yang ditentukan di kelas dasar.
  • Pewarisan menciptakan hubungan "is-a" antar kelas.

Implementasi antarmuka memiliki karakteristik berikut:

  • Kelas dapat menerapkan beberapa antarmuka.
  • Kelas dapat menentukan perilakunya sendiri dan mengimplementasikan anggota yang ditentukan dalam antarmuka.
  • Implementasi antarmuka membuat hubungan "dapat dilakukan" antar kelas.

Perbedaan antara hubungan "is-a" dan "can-do" penting saat merancang sistem berorientasi objek. Secara umum, Anda harus menggunakan pewarisan kelas ketika kelas turunan adalah versi khusus dari kelas dasar. Anda harus menggunakan implementasi antarmuka saat kelas dapat melakukan serangkaian tindakan tertentu.

Contoh kapan menggunakan pewarisan kelas adalah ketika Anda memiliki kelas dasar bernama Dog dan kelas turunan bernama German Shepherd dan Golden Retriever. German Shepherd dan Golden Retriever adalah versi khusus dari Dog. Dalam hal ini, Anda dapat menggunakan pewarisan kelas untuk menentukan sekumpulan properti dan metode umum di kelas Dog lalu memperluas dan memodifikasi perilaku tersebut di kelas German Shepherd dan Golden Retriever.

Contoh kapan menggunakan implementasi antarmuka adalah ketika Anda memiliki antarmuka bernama IDrawable yang menentukan metode Draw. Anda dapat menerapkan antarmuka IDrawable di kelas yang dapat digambar, seperti Circle dan Rectangle. Dalam hal ini, Anda dapat menggunakan implementasi antarmuka untuk menentukan serangkaian tindakan umum yang dibagikan oleh kelas yang berbeda.

Membandingkan warisan kelas dengan polimorfisme

Warisan kelas dan polimorfisme adalah konsep yang terkait erat dalam pemrograman berorientasi objek. Pewarisan memungkinkan Anda menentukan hierarki kelas yang berbagi perilaku umum, sementara polimorfisme memungkinkan Anda memperlakukan objek kelas turunan sebagai objek kelas dasar mereka.

Misalnya, pertimbangkan kelas dasar bernama HousePet dan kelas turunan bernama Dog dan Cat. Kelas HousePet mendefinisikan metode Speak yang mengembalikan string yang mewakili suara yang dibuat hewan peliharaan. Kelas Dog mengambil alih metode Speak untuk mengembalikan "Woof", dan kelas Cat mengambil alih metode Speak untuk mengembalikan "Meow". Anda dapat membuat objek HousePet bernama myPet jenis Dog atau Cat dan memanggil metode Speak untuk mendapatkan respons yang sesuai.

Dalam contoh ini, kelas HousePet mendefinisikan perilaku Speak umum yang dibagikan kelas Dog dan Cat. Kelas Dog dan Cat mengambil alih metode Speak untuk menyesuaikan perilaku. Saat Anda memanggil metode Speak pada objek HousePet yang mereferensikan salah satu kelas turunan, Anda mendapatkan respons yang sesuai berdasarkan jenis objek. Berikut adalah sampel kode yang menunjukkan konsep ini:

HousePet myPet1 = new Dog();    // Create a HousePet object named myPet1 that's of type Dog
HousePet myPet2 = new Cat();    // Create a HousePet object named myPet2 that's of type Cat

Console.WriteLine(myPet1.Speak());    // Call the Speak method on myPet1
Console.WriteLine(myPet2.Speak());    // Call the Speak method on myPet2

// Output: Woof
//         Meow

public class HousePet
{
    public virtual string Speak()
    {
        return "Hello";
    }
}

public class Dog : HousePet
{
    public override string Speak()
    {
        return "Woof";
    }
}

public class Cat : HousePet
{
    public override string Speak()
    {
        return "Meow";
    }
}

Polimorfisme memungkinkan Anda menulis kode yang berfungsi dengan objek dari berbagai jenis tanpa mengetahui jenis spesifiknya pada waktu kompilasi. Dalam contoh ini, polimorfisme dicapai dengan membuat instans kelas HousePet yang berjenis Dog atau Cat. Metode Speak dipanggil pada objek HousePet, dan respons yang sesuai dikembalikan berdasarkan jenis objek, baik "Woof" atau "Meow". Dalam C#, polimorfisme dapat dicapai dengan menggunakan pewarisan kelas atau implementasi antarmuka.

Ringkasan

Warisan adalah konsep mendasar dalam pemrograman berorientasi objek yang memungkinkan Anda membuat hierarki kelas dengan menentukan hubungan antar kelas. Di C#, Anda dapat menggunakan pewarisan kelas untuk membuat kelas dasar yang menentukan perilaku dan karakteristik umum, lalu membuat kelas turunan yang mewarisi dan memperluas perilaku tersebut. Warisan memberikan beberapa manfaat, termasuk penggunaan kembali kode, ekstensibilitas, enkapulasi, konsistensi, dan polimorfisme. Dengan menggunakan pewarisan, Anda dapat membuat kode yang lebih dapat dipertahankan dan dapat diperluas.