OOP: Abstraction

KristiadhyKristiadhy
5 min read
  • Menyembunyikan kompleksitas dengan hanya mengekspos detail yang diperlukan.

  • Hal ini memungkinkan pengguna untuk berinteraksi dengan objek dan sistem tanpa perlu memahami semua detail implementasi yang mendasarinya.

Contoh dalam dunia nyata.

Remote TV.

  • Remote TV mempunyai beberapa fungsi seperti menyalakan atau mematikan TV, mengganti channel, membesarkan volume suara, dsb.

  • Sebagai pengguna kita hanya tahu bahwa fungsi tersebut akan dieksekusi hanya dengan memencet tombol sesuai fungsi pada remote.

  • Apa yang sebenarnya terjadi di belakang layar tersembunyi bagi kita.

Manfaat menggunakan Abstraction.

  • Mengurangi kompleksitas.

    Prinsip ini hanya menyediakan signature method dengan menyembunyikan bagaimana method tersebut diimplementasikan.

  • Meningkatkan keamanan.

    Karena kita hanya menyediakan detail yang diperlukan untuk memanggil metode dengan menyembunyikan bagaimana metode tersebut diimplementasikan.

  • Memudahkan pengembangan.

    Karena tanpa mempengaruhi pengguna dari method tersebut, kita dapat melakukan segala jenis perubahan dalam sistem internal kita.

Abstraction dapat dicapai dengan 2 cara:

  • Menggunakan abstract class dan abstract method.

  • Menggunakan Interface.

Abstract class dan abstract method.

Ciri abstract class.

  • Tidak dapat diinstansiasi secara langsung.

  • Berfungsi sebagai blueprint untuk class lain, yang berarti class ini dapat berisi metode abstrak atau abstract method (yang harus diimplementasikan oleh kelas-kelas turunannya) dan juga metode konkret atau concrete method (yang memiliki implementasi penuh).

Ciri abstract method.

  • Dideklarasikan pada abstract class yang tidak memiliki implementasi.

  • Hanya memiliki method signature (nama metode, tipe pengembalian, dan parameter) tanpa implementasi.

  • Implementasi sesungguhnya diserahkan kepada kelas turunannya.

Contoh abstract class dengan semua abstract method.

public abstract class IBank
{
    public abstract void ValidateCard();
    public abstract void WithdrawMoney();
    public abstract void CheckBalanace();
    public abstract void BankTransfer();
    public abstract void MiniStatement();
}
public class SBI : IBank
{
    public override void BankTransfer()
    {
        Console.WriteLine("SBI Bank Bank Transfer");
    }
    public override void CheckBalanace()
    {
        Console.WriteLine("SBI Bank Check Balanace");
    }
    public override void MiniStatement()
    {
        Console.WriteLine("SBI Bank Mini Statement");
    }
    public override void ValidateCard()
    {
        Console.WriteLine("SBI Bank Validate Card");
    }
    public override void WithdrawMoney()
    {
        Console.WriteLine("SBI Bank Withdraw Money");
    }
}
IBank sbi = new SBI();
sbi.ValidateCard();
sbi.WithdrawMoney();
sbi.CheckBalanace();
sbi.BankTransfer();
sbi.MiniStatement();

Pada code di atas, kita mendeklarasikan sebuah class sebagai abstract class dengan menambahkan modifier abstract. Selanjutnya kita juga mendeklarasikan semua method nya sebagai abstract method dimana tidak boleh ada implementasi didalamnya (hanya body method nya saja). Namun ketika kita membuat kelas turunan dari IBank, dalam contoh diatas adalah SBI, maka semua method dari IBank harus dibuat implementasinya dengan menambahkan kata kunci override pada setiap method pada child class nya.

Kita juga perlu memperhatikan saat proses inisialisasi objek. Pada bagian kiri atau reference type nya, kita set objek ‘sbi’ sebagai IBank, yaitu abstract class nya, sedangkan pada bagian kanan atau object type nya kita set sebagai class SBI. Ketika kita melakukan pemanggilan method, compiler mengenali semua method tersebut karena ada dalam abstract class nya, namun ketika dijalankan saat runtime, barulah ditentukan implementasinya berdasarkan object type nya, dalam hal ini SBI.

Contoh abstract class dengan abstract method & concrete method.

public abstract class Bird
{
    public abstract void Fly();
    public void LayEggs()
    {
        Console.WriteLine("Laying eggs");
    }
}
public class Sparrow : Bird
{
    public override void Fly()
    {
        Console.WriteLine("Sparrow is flying");
    }
}

Pada contoh kode di atas, kita mendeklarasikan sebagian metode sebagai abstract method dan sebagian lainnya sebagai concrete method. Dengan cara ini, ketika kita membuat kelas turunan atau child class, maka harus melakukan override untuk method Fly() karena pada parent class, method tersebut diset sebagai abstract method (tanpa implementasi), sedangkan method LayEggs() tidak dilakukan override karena merupakan concrete method (dengan implementasi).

Interface.

Interface adalah sebuah tipe abstrak yang digunakan untuk mendefinisikan kontrak (atau blueprint) bagi kelas yang mengimplementasikannya.

Berikut kita lihat langsung contoh code nya.

interface ISpeakable
{
    void Speak();  // Method ini harus diimplementasikan oleh child class nya
}

interface IMoveable
{
    void Move();
}

public class Dog : ISpeakable, IMoveable
{
    public void Speak()
    {
        Console.WriteLine("Bark");
    }

    public void Move()
    {
        Console.WriteLine("Dog is running");
    }
}
Dog dog = new Dog();
dog.Speak();
dog.Move();

Catatan: Sebuah kelas disebut mengimplementasikan interface, bukan mewarisi (inherit) interface.

Pada code diatas, kita bisa melihat bahwa class Dog mengimplementasikan 2 interface sekaligus yaitu ISpeakable dan IMoveable, hal ini memungkinkan untuk dilakukan, berbeda dengan abstract class yang tidak mengijinkan child class untuk diturunkan dari dua class sekaligus (C# mengijinkan sebuah class diturunkan hanya dari satu class saja).

Konsep interface ini sangat populer dan sering kita jumpai dalam berbagai project yang cukup kompleks.

Perbedaan abstract class dan interface.

Lihat perbedaan antara abstract class dan interface melalui tabel berikut ini.

AspekAbstract ClassInterface
SifatMewakili hubungan "adalah-sebuah” atau “is-a"Mewakili hubungan "dapat melakukan” atau “can do"
Implementasi metodeParent class dapat memiliki abstract dan concrete method.Hanya memiliki method signature (nama, parameter, tipe pengembalian).
Data memberDapat memiliki field, constructor, dan propertyDapat memiliki property, event, indexer, tapi tidak dengan field.
Multiple inheritenceTidak mendukung multiple inheritenceMendukung multiple inheritence
TujuanKetika beberapa class berbagi method yang sama tetapi juga perlu menambah beberapa perilaku yang belum diimplementasikanKetika perlu mendefinisikan kontrak yang harus diimplementasikan oleh class.
Default access modifierKarena class, maka default modifier nya adalah private.Secara default modifier diset sebagai public.

Kita sudah selesai membahas konsep Abstraction pada Pemrograman Berorientasi Objek (PBO), dengan demikian maka selesai sudah pembahasan kita mengenai 4 pilar dari Pemrograman Berorientasi Objek (PBO). Terima kasih!

0
Subscribe to my newsletter

Read articles from Kristiadhy directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Kristiadhy
Kristiadhy

Experienced Full Stack .NET developer with a proven track record of designing and implementing robust business applications. Proficient in using ASP.NET Core Web API, Blazor, and WinForms to deliver high-quality, efficient code and scalable solutions. Strong focus on implementing industry best practices for cleaner and scalable outcomes.