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.
Tantangan
MudahMari 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 bernamaIPlayabledi namespaceMedia. Interface ini mewakili kontrak untuk apa pun yang dapat memutar media, baik itu ponsel, TV, maupun pemutar musik khusus. Interface ini harus mendeklarasikan satu methodPlay()yang mengembalikan string.MediaFile.cs: Definisikan abstract class bernamaMediaFiledi namespaceMedia. Class ini mewakili fondasi bersama untuk semua file media. Class ini harus memiliki propertyTitle(string) dan propertyDuration(int, yang menunjukkan durasi dalam detik). Sertakan constructor yang menetapkan kedua nilai tersebut. Tambahkan method konkret bernamaGetInfo()yang mengembalikan"{Title} ({Duration}s)". Deklarasikan juga method abstrakGetType()yang mengembalikan string, setiap jenis media akan menentukan jenis filenya.AudioFile.cs: Definisikan classAudioFiledi namespaceMediayang mewarisiMediaFiledan mengimplementasikanIPlayable. Tambahkan propertyArtist(string). Constructor harus menerima title, duration, dan artist. OverrideGetType()agar mengembalikan"Audio". ImplementasikanPlay()agar mengembalikan"Playing audio: {Title} by {Artist}".Program.cs: Di file utama, buatAudioFilemenggunakan nilai input. Tunjukkan kedua aspek class ini: panggilGetInfo()danGetType()(yang diwarisi dari abstract class), lalu panggilPlay()(dari interface). Simpan file audio dalam variabelIPlayabledan panggilPlay()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 QueenPerhatikan 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
}
}
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