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 220VTeknik 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.
Tantangan
MudahMari 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 bernamaIDisplayabledi namespaceReports. Interface ini mewakili konten yang dapat ditampilkan di layar. Interface ini harus mendeklarasikan methodRender()yang mengembalikan string.IPrintable.cs: Definisikan interface bernamaIPrintabledi namespaceReports. Interface ini mewakili konten yang dapat dikirim ke printer. Interface ini juga harus mendeklarasikan methodRender()yang mengembalikan string. Perhatikan bahwa ini menimbulkan benturan nama denganIDisplayable!Report.cs: Definisikan classReportdi namespaceReportsyang mengimplementasikanIDisplayabledanIPrintable. Laporan ini harus memiliki propertyTitle(string) dan propertyContent(string), serta constructor yang menetapkan kedua nilai tersebut. Gunakan implementasi interface eksplisit untuk menyediakan perilakuRender()yang berbeda:- Saat ditampilkan:
"[SCREEN] {Title}: {Content}" - Saat dicetak:
"[PRINT] {Title} | {Content}"
- Saat ditampilkan:
Program.cs: Di file utama, buatReportmenggunakan nilai input. Karena implementasi eksplisit hanya dapat diakses melalui variabel interface, simpan laporan yang sama di variabelIDisplayabledan variabelIPrintable, lalu panggilRender()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
}
}
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