14 September 2022
•
8 menit baca
Abstract Class dan Interface Apa Perbedaannya? (C#)
Membedakan dua konsep yang sama-sama terasa abstrak, tapi punya peran desain yang berbeda.

Kebingungan yang sering muncul saat belajar OOP
Ketika mulai mendalami OOP, abstract class dan interface sering terasa mirip karena keduanya sama-sama membantu abstraksi. Keduanya juga sama-sama memberi cara untuk mendefinisikan perilaku pada turunan atau implementasi.
Masalahnya, kalau hanya dilihat dari definisinya, keduanya memang terlihat seperti saudara dekat. Bedanya baru terasa ketika kita mulai mendesain relasi antar kelas di dunia nyata.
Kapan abstract class lebih cocok
Abstract class tepat digunakan saat kita memiliki beberapa turunan yang berbagi struktur dan sebagian logika yang sama. Ia tidak cuma menjadi kontrak, tetapi juga tempat untuk meletakkan implementasi dasar yang memang pantas diwariskan.
Contoh sederhananya adalah kelas `Cinema` yang punya cara umum menghitung total biaya pelanggan. Setiap turunan boleh menghitung admin fee dengan aturan berbeda, tetapi cara menjumlahkan total tetap bisa dibagikan dari kelas induk.
abstract class Cinema
{
public abstract decimal Price { get; }
public abstract decimal ParkingFee { get; }
public abstract decimal CalculateAdminFee();
public decimal TotalCustomerSpend()
{
return Price + ParkingFee + CalculateAdminFee();
}
}Abstract class berguna saat kita ingin turunan berbagi bentuk sekaligus logika yang sudah pasti sama.
Kapan interface lebih cocok
Interface lebih pas ketika yang ingin kita definisikan hanyalah kemampuan atau kontrak. Ia tidak perlu tahu bagaimana kemampuan itu diimplementasikan, selama kelas yang memakainya memenuhi janji yang diminta.
Karena satu kelas bisa mengimplementasikan banyak interface, pendekatan ini sangat berguna untuk memodelkan perilaku lintas hirarki, misalnya sesuatu yang bisa terbang, bisa di-cache, atau bisa diaudit.
interface IRobot
{
string Name { get; }
void CanWalk();
void CanSpin();
}
interface ICanFly
{
void Fly();
}Interface menekankan kemampuan yang harus tersedia, bukan implementasi bersama.
Cara memilih tanpa drama
Pertanyaan praktisnya sederhana: apakah saya hanya ingin mendefinisikan kemampuan, atau juga membagikan logika dasar? Jika hanya kontrak, interface biasanya lebih tepat. Jika butuh logika bersama dan relasi turunan yang jelas, abstract class lebih masuk akal.
Dengan sudut pandang ini, keputusan desain jadi terasa lebih tenang. Kita tidak lagi memilih berdasarkan istilah, tetapi berdasarkan kebutuhan model di domain aplikasi.
Simpulan
Abstract class dan interface sama-sama membantu menyembunyikan kerumitan, tetapi caranya berbeda. Abstract class memberi tempat untuk berbagi perilaku, sedangkan interface memberi kontrak atas kemampuan.
Kalau desainmu terasa buntu, coba cek lagi apakah yang dibutuhkan adalah pewarisan logika atau sekadar definisi kemampuan. Biasanya jawabannya langsung mengarah ke salah satu.
Artikel terkait

28 September 2022
•
11 menit baca
Melakukan CRUD Lebih Mudah dengan Entity Framework Core
Pembahasan dasar tentang ORM, komponen inti EF Core, pendekatan code-first, dan studi kasus CRUD entitas User menggunakan SQL Server lalu dipindahkan ke SQLite.

21 September 2022
•
9 menit baca
Belajar Melakukan Unit Testing Automation dengan xUnit
Tulisan ini mengajak kita memahami pentingnya testing, menyiapkan project xUnit, lalu menulis assertion dasar agar perubahan kode lebih aman.

7 September 2022
•
7 menit baca
Berkenalan dengan LINQ pada C#
Artikel pengantar tentang LINQ, cara kerjanya di `IEnumerable<T>` atau `IQueryable<T>`, dan beberapa operasi yang sering dipakai saat mengolah data.