Subbab 7 / 9

Abstract Class, Interface, dan Class Library

Abstraction

Abstraction (abstraksi) adalah salah satu konsep dalam OOP yang digunakan untuk menyembunyikan detail proses dan hanya menampilkan bagian yang memang perlu digunakan.

Sederhananya: menampilkan yang penting saja dan menyembunyikan detail yang tidak perlu diketahui pengguna.

Contohnya saat login ke sebuah aplikasi. Pengguna cukup memasukkan email dan password lalu menekan tombol login. Proses pengecekan database, validasi password, dan autentikasi tidak perlu diketahui oleh pengguna.

Dalam C#, abstraction biasanya diterapkan menggunakan:

  1. Abstract Class
  2. Interface

Abstraction juga berkaitan dengan konsep OOP lain seperti encapsulation, inheritance, dan polymorphism.


1. Abstract Class

1.1 Pengertian

Abstract Class adalah class yang digunakan sebagai dasar untuk class turunannya. Abstract class tidak bisa dibuat menjadi object secara langsung dan biasanya digunakan ketika beberapa class memiliki karakteristik atau proses dasar yang sama.

Abstract class dapat memiliki:

  • Method biasa yang sudah memiliki isi.
  • Abstract method yang belum memiliki isi.
  • Property, field, dan constructor.
  • Abstract method yang harus diimplementasikan class turunan menggunakan override.

Contohnya, Kendaraan dapat dijadikan abstract class karena Mobil dan Motor sama-sama termasuk kendaraan, tetapi cara setiap kendaraan berjalan bisa berbeda.

1.2 Contoh Abstract Class

csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;

abstract class Kendaraan
{
    public abstract void Jalan();

    public void Info()
    {
        Console.WriteLine("Ini adalah kendaraan");
    }
}

class Mobil : Kendaraan
{
    public override void Jalan()
    {
        Console.WriteLine("Mobil berjalan dengan roda");
    }
}

class Program
{
    static void Main()
    {
        Mobil mobil = new Mobil();
        mobil.Info();
        mobil.Jalan();
    }
}

Pada contoh tersebut, Kendaraan adalah abstract class. Method Jalan() belum memiliki implementasi di class Kendaraan, sehingga class Mobil harus mengimplementasikannya menggunakan override. Sementara itu, Info() adalah method biasa yang langsung dapat digunakan oleh class turunannya.

1.3 Contoh pada Sistem Pembayaran

Pada sistem pembayaran, bagian yang sama dapat ditempatkan di abstract class Pembayaran, sedangkan proses pembayarannya dibuat abstract karena setiap metode pembayaran mempunyai proses yang berbeda.

csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
abstract class Pembayaran
{
    public string NamaMetode { get; set; }

    public Pembayaran(string nama)
    {
        NamaMetode = nama;
    }

    public abstract void ProsesPembayaran(decimal jumlah);
}

class TransferBank : Pembayaran
{
    public TransferBank() : base("Transfer Bank") { }

    public override void ProsesPembayaran(decimal jumlah)
    {
        Console.WriteLine($"Transfer {jumlah} melalui bank");
    }
}

class EWallet : Pembayaran
{
    public EWallet() : base("E-Wallet") { }

    public override void ProsesPembayaran(decimal jumlah)
    {
        Console.WriteLine($"Bayar {jumlah} menggunakan E-Wallet");
    }
}

TransferBank dan EWallet sama-sama merupakan jenis Pembayaran, tetapi isi ProsesPembayaran() dibuat berbeda sesuai kebutuhan masing-masing.


2. Interface

2.1 Pengertian

Interface adalah aturan atau kontrak yang menentukan kemampuan yang harus dimiliki sebuah class. Jika sebuah class mengimplementasikan interface, class tersebut harus menyediakan implementasi dari anggota yang dibutuhkan interface tersebut.

Sederhananya: interface menentukan apa yang harus tersedia, sedangkan class menentukan bagaimana cara menjalankannya.

Interface cocok digunakan ketika beberapa class memiliki kemampuan yang sama meskipun tidak harus memiliki hubungan parent-child. Satu class juga dapat mengimplementasikan lebih dari satu interface.

2.2 Contoh Interface

csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;

interface IHewan
{
    void Suara();
}

class Kucing : IHewan
{
    public void Suara()
    {
        Console.WriteLine("Meong");
    }
}

class Anjing : IHewan
{
    public void Suara()
    {
        Console.WriteLine("Guk guk");
    }
}

IHewan menentukan bahwa class yang menggunakannya harus memiliki Suara(). Kucing dan Anjing sama-sama memenuhi kontrak tersebut, tetapi implementasinya berbeda.

2.3 Interface dalam Sistem Pembayaran

Pada sistem pembayaran, interface IPembayaran dapat digunakan sebagai kontrak agar setiap metode pembayaran memiliki proses pembayaran.

csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
interface IPembayaran
{
    void ProsesPembayaran(decimal jumlah);
}

class TransferBank : IPembayaran
{
    public void ProsesPembayaran(decimal jumlah)
    {
        Console.WriteLine($"Transfer {jumlah} melalui bank");
    }
}

class EWallet : IPembayaran
{
    public void ProsesPembayaran(decimal jumlah)
    {
        Console.WriteLine($"Bayar {jumlah} menggunakan E-Wallet");
    }
}

class PaymentService
{
    public void Bayar(IPembayaran metode, decimal jumlah)
    {
        metode.ProsesPembayaran(jumlah);
    }
}

PaymentService cukup menerima object bertipe IPembayaran. Selama sebuah class memenuhi kontrak IPembayaran, class tersebut dapat digunakan oleh service tanpa harus mengetahui detail prosesnya.

Perbedaan Abstract Class dan Interface

Keduanya sama-sama dapat digunakan untuk abstraction, tetapi tujuan penggunaannya berbeda.

Abstract Class

Interface

Digunakan sebagai dasar class turunan

Digunakan sebagai aturan atau kontrak

Bisa memiliki method biasa dan abstract method

Berfokus pada kemampuan/perilaku yang harus tersedia

Bisa memiliki property, field, dan constructor

Tidak digunakan sebagai class dasar yang menyimpan state dengan cara yang sama

Class hanya dapat mewarisi satu class

Class dapat mengimplementasikan beberapa interface

Cocok untuk hubungan parent-child

Cocok untuk kemampuan yang sama pada beberapa class


Contoh Abstract Class: Mobil, Motor, dan Bus dapat diturunkan dari Kendaraan karena memiliki hubungan yang jelas sebagai jenis kendaraan.

Contoh Interface: TransferBank, EWallet, dan KartuKredit dapat menggunakan IPembayaran karena semuanya memiliki kemampuan melakukan pembayaran.

3. Class Library

3.1 Pengertian

Class Library adalah project yang berisi kumpulan kode yang dibuat agar dapat digunakan kembali oleh project lain. Isinya dapat berupa class, abstract class, interface, enum, utility, atau service.

Class Library biasanya tidak memiliki Main() karena bukan aplikasi yang dijalankan secara langsung. Pada .NET, hasil build Class Library biasanya berupa file .dll.

Kegunaan Class Library antara lain:

  • Menghindari penulisan kode yang sama berulang kali.
  • Memisahkan logic program dari aplikasi utama.
  • Membuat struktur project lebih rapi dan modular.
  • Mempermudah maintenance dan penggunaan kembali kode.

Contohnya, PaymentLibrary dapat menyimpan kode pembayaran dan kemudian digunakan oleh Console App, Desktop App, atau project lain.

3.2 Contoh Isi Class Library


csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace PaymentLibrary
{
    public interface IPembayaran
    {
        void Bayar(decimal jumlah);
    }

    public class TransferBank : IPembayaran
    {
        public void Bayar(decimal jumlah)
        {
            Console.WriteLine($"Transfer {jumlah} melalui bank");
        }
    }
}

Project lain yang sudah mereferensikan PaymentLibrary cukup memanggil namespace dan class yang tersedia di dalam library tersebut.

csharp
1
2
3
4
5
6
7
8
9
10
using PaymentLibrary;

class Program
{
    static void Main()
    {
        TransferBank transfer = new TransferBank();
        transfer.Bayar(100000);
    }
}

Membuat Class Library di Visual Studio

Contoh sederhana: PaymentLibrary sebagai Class Library dan PaymentConsole sebagai project yang menggunakannya.

  1. Buka Visual Studio, pilih Create a new project, lalu pilih Class Library (.NET).
  2. Beri nama project, misalnya PaymentLibrary.
  3. Tambahkan class atau interface yang dibutuhkan, misalnya IPembayaran.cs dan TransferBank.cs.
  4. Klik kanan PaymentLibrary → build → cek directory hasil.
  5. Pada Navigasi di atas, pilih File→ New → Procect/Solution → Console App, lalu beri nama PaymentConsole.
  6. Klik kanan PaymentConsole → Add → Project Reference → browse file .dll hasil build → centang PaymentLibrary → OK.
  7. Di Program.cs, tambahkan using PaymentLibrary; lalu gunakan class dari library.

Setelah Project Reference ditambahkan, PaymentConsole dapat menggunakan class public yang berada di PaymentLibrary. Ketika dibuild, Class Library akan menghasilkan file .dll.`


Ringkasan

KonsepFungsi
AbstractionMenyembunyikan detail implementasi dan menampilkan bagian penting.
Abstract ClassMenjadi dasar untuk class turunannya.
InterfaceMemberikan aturan atau kontrak yang harus dipenuhi.
Class LibraryMenyimpan dan mengorganisasi kode agar dapat digunakan kembali.