Menu
CoddyTech

Antarmuka eksplisit

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

Ketika sebuah class mengimplementasikan beberapa interface yang memiliki member dengan nama yang sama, kamu menghadapi benturan nama. Implementasi interface eksplisit mengatasi masalah ini dengan memungkinkan kamu menyediakan implementasi terpisah untuk setiap interface.

Dengan implementasi eksplisit, kamu menambahkan nama interface sebagai awalan pada nama member dan menghilangkan modifier akses:

public interface IAmericanPlug
{
    void Connect();
}

public interface IEuropeanPlug
{
    void Connect();
}

public class UniversalAdapter : IAmericanPlug, IEuropeanPlug
{
    void IAmericanPlug.Connect()
    {
        Console.WriteLine("Connected to 120V");
    }
    
    void IEuropeanPlug.Connect()
    {
        Console.WriteLine("Connected to 220V");
    }
}

Member yang diimplementasikan secara eksplisit hanya dapat diakses melalui variabel bertipe interface, bukan melalui class itu sendiri:

var adapter = new UniversalAdapter();
// adapter.Connect();  // Tidak bisa compile!

IAmericanPlug american = adapter;
american.Connect();  // Terhubung ke 120V

IEuropeanPlug european = adapter;
european.Connect();  // Terhubung ke 220V

Teknik ini juga berguna saat kamu ingin menyembunyikan anggota antarmuka dari API publik class. Jika sebuah method hanya masuk akal saat object diperlakukan sebagai antarmuka tertentu, implementasi eksplisit menjaga cakupan class tetap bersih sekaligus memenuhi kontrak.

challenge icon

Tantangan

Mudah

Mari buat sistem pembuat laporan yang menunjukkan bagaimana implementasi interface eksplisit memungkinkan satu class memberikan perilaku berbeda, bergantung pada interface yang digunakan. Kamu akan membuat dokumen yang dapat diformat secara berbeda untuk ditampilkan dan dicetak.

Kamu akan menyusun kodemu dalam empat file:

  • IDisplayable.cs: Definisikan interface bernama IDisplayable di namespace Reports. Interface ini mewakili konten yang dapat ditampilkan di layar. Interface ini harus mendeklarasikan method Render() yang mengembalikan string.
  • IPrintable.cs: Definisikan interface bernama IPrintable di namespace Reports. Interface ini mewakili konten yang dapat dikirim ke printer. Interface ini juga harus mendeklarasikan method Render() yang mengembalikan string. Perhatikan bahwa ini menimbulkan benturan nama dengan IDisplayable!
  • Report.cs: Definisikan class Report di namespace Reports yang mengimplementasikan IDisplayable dan IPrintable. Laporan ini harus memiliki property Title (string) dan property Content (string), serta constructor yang menetapkan kedua nilai tersebut. Gunakan implementasi interface eksplisit untuk menyediakan perilaku Render() yang berbeda:
    • Saat ditampilkan: "[SCREEN] {Title}: {Content}"
    • Saat dicetak: "[PRINT] {Title} | {Content}"
  • Program.cs: Di file utama, buat Report menggunakan nilai input. Karena implementasi eksplisit hanya dapat diakses melalui variabel interface, simpan laporan yang sama di variabel IDisplayable dan variabel IPrintable, lalu panggil Render() pada masing-masing variabel untuk menunjukkan bagaimana object yang sama menghasilkan output berbeda, bergantung pada interface yang kamu gunakan untuk mengaksesnya.

Kamu akan menerima dua input:

  • Judul laporan
  • Konten laporan

Cetak output dengan format berikut:

Display version:
{Render() via IDisplayable}
Print version:
{Render() via IPrintable}

Misalnya, jika inputnya adalah Sales Report dan Q4 revenue increased by 15%, outputnya akan seperti berikut:

Display version:
[SCREEN] Sales Report: Q4 revenue increased by 15%
Print version:
[PRINT] Sales Report | Q4 revenue increased by 15%

Perhatikan bagaimana object Report yang sama berperilaku berbeda, bergantung pada referensi interface yang kamu gunakan untuk mengaksesnya. Inilah keunggulan implementasi interface eksplisit, yaitu mengatasi benturan nama sambil menyediakan perilaku yang sesuai konteks!

Coba sendiri

using System;
using Reports;

class Program
{
    public static void Main(string[] args)
    {
        // Baca input
        string title = Console.ReadLine();
        string content = Console.ReadLine();

        // TODO: Buat object Report dengan title dan content

        // TODO: Simpan report dalam variabel IDisplayable

        // TODO: Simpan report yang sama dalam variabel IPrintable

        // TODO: Tampilkan versi tampilan dengan memanggil Render() pada IDisplayable
        Console.WriteLine("Display version:");
        // Tampilkan hasil Render() di sini

        // TODO: Tampilkan versi cetak dengan memanggil Render() pada IPrintable
        Console.WriteLine("Print version:");
        // Tampilkan hasil Render() di sini
    }
}
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