Menu
CoddyTech

Antarmuka vs kelas abstrak

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

Baik interface maupun class abstrak memungkinkan kamu mendefinisikan kontrak yang harus diikuti class lain, tetapi keduanya memiliki tujuan berbeda dan kemampuan yang berbeda.

interface mendefinisikan hal yang harus dilakukan sebuah class, tanpa implementasi apa pun. Ini adalah kontrak murni:

public interface IFlyable
{
    void Fly();
}

public class Bird : IFlyable
{
    public void Fly()
    {
        Console.WriteLine("Flapping wings");
    }
}

abstract class dapat menyediakan kontrak sekaligus implementasi bersama. Ini adalah cetak biru parsial:

public abstract class Vehicle
{
    public string Brand { get; set; }
    
    public void StartEngine()
    {
        Console.WriteLine("Engine started");
    }
    
    public abstract void Drive();  // Harus diimplementasikan
}

public class Car : Vehicle
{
    public override void Drive()
    {
        Console.WriteLine("Driving on roads");
    }
}

Perbedaan utamanya terletak pada aturan pewarisan dan tujuannya.

Sebuah class dapat mengimplementasikan beberapa interface, tetapi hanya dapat mewarisi satu abstract class.

Sebuah class juga dapat mewarisi abstract class dan mengimplementasikan interface sekaligus: setelah titik dua, base class ditulis terlebih dahulu, lalu interface, dipisahkan dengan koma:

public class Airplane : Vehicle, IFlyable
{
    public override void Drive()
    {
        Console.WriteLine("Taxiing to the runway");
    }

    public void Fly()
    {
        Console.WriteLine("Flying above the clouds");
    }
}

Gunakan interface saat class yang tidak berhubungan perlu berbagi perilaku (seperti IFlyable untuk burung dan pesawat). Gunakan abstract class saat class yang berhubungan berbagi kode dan status umum (seperti kendaraan yang berbagi mekanisme menyalakan mesin).

abstract class dapat memiliki constructor, field, dan access modifier pada anggotanya. Secara tradisional, interface tidak bisa, meskipun C# modern memungkinkan implementasi default.

Jika ragu, pilih interface agar lebih fleksibel. Kamu selalu bisa menambahkan abstract class nanti jika implementasi bersama diperlukan.

challenge icon

Tantangan

Mudah

Mari buat sistem pemutar media yang menunjukkan kapan sebaiknya menggunakan interface dibandingkan abstract class. Kamu akan membuat desain tempat perangkat yang tidak saling terkait berbagi perilaku pemutaran melalui interface, sementara jenis media yang saling terkait berbagi implementasi umum melalui abstract class.

Kamu akan mengatur kodemu dalam empat file:

  • IPlayable.cs: Definisikan interface bernama IPlayable di namespace Media. Interface ini mewakili kontrak untuk apa pun yang dapat memutar media, baik itu ponsel, TV, maupun pemutar musik khusus. Interface ini harus mendeklarasikan satu method Play() yang mengembalikan string.
  • MediaFile.cs: Definisikan abstract class bernama MediaFile di namespace Media. Class ini mewakili fondasi bersama untuk semua file media. Class ini harus memiliki property Title (string) dan property Duration (int, yang menunjukkan durasi dalam detik). Sertakan constructor yang menetapkan kedua nilai tersebut. Tambahkan method konkret bernama GetInfo() yang mengembalikan "{Title} ({Duration}s)". Deklarasikan juga method abstrak GetType() yang mengembalikan string, setiap jenis media akan menentukan jenis filenya.
  • AudioFile.cs: Definisikan class AudioFile di namespace Media yang mewarisi MediaFile dan mengimplementasikan IPlayable. Tambahkan property Artist (string). Constructor harus menerima title, duration, dan artist. Override GetType() agar mengembalikan "Audio". Implementasikan Play() agar mengembalikan "Playing audio: {Title} by {Artist}".
  • Program.cs: Di file utama, buat AudioFile menggunakan nilai input. Tunjukkan kedua aspek class ini: panggil GetInfo() dan GetType() (yang diwarisi dari abstract class), lalu panggil Play() (dari interface). Simpan file audio dalam variabel IPlayable dan panggil Play() lagi untuk menunjukkan polimorfisme interface.

Kamu akan menerima tiga input:

  • Judul lagu
  • Durasi dalam detik
  • Nama artis

Cetak output dengan format berikut:

Info: {GetInfo() result}
Type: {GetType() result}
Direct: {Play() result}
Via Interface: {Play() result from IPlayable variable}

Contohnya, jika inputnya adalah Bohemian Rhapsody, 354, dan Queen, outputnya akan seperti berikut:

Info: Bohemian Rhapsody (354s)
Type: Audio
Direct: Playing audio: Bohemian Rhapsody by Queen
Via Interface: Playing audio: Bohemian Rhapsody by Queen

Perhatikan bagaimana AudioFile mendapatkan manfaat dari kedua pendekatan: class ini mewarisi implementasi bersama (GetInfo()) dari abstract class sekaligus memenuhi kontrak IPlayable. Abstract class menyediakan penggunaan ulang kode untuk jenis media yang saling terkait, sementara interface memungkinkan class apa pun yang tidak saling terkait menjadi "playable" tanpa berbagi hierarki pewarisan.

Coba sendiri

using System;
using Media;

class Program
{
    public static void Main(string[] args)
    {
        // Baca nilai input
        string title = Console.ReadLine();
        int duration = Convert.ToInt32(Console.ReadLine());
        string artist = Console.ReadLine();
        
        // TODO: Buat AudioFile menggunakan nilai input
        
        // TODO: Cetak Info: lalu hasil GetInfo()
        
        // TODO: Cetak Type: lalu hasil GetType()
        
        // TODO: Cetak Direct: lalu hasil Play()
        
        // TODO: Simpan file audio dalam variabel IPlayable
        
        // TODO: Cetak Via Interface: lalu hasil Play() dari variabel IPlayable
    }
}
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