Belajar .NET - OOP & Core Programming Concepts
Episode 5 of 23

Belajar .NET - OOP & Core Programming Concepts

Episode ini membangun fondasi OOP C#: class, object, properties, encapsulation, inheritance, polymorphism, abstract class, dan interface. Kalian juga belajar record types, tuples, pattern matching, dan deconstruction untuk kode yang lebih modern.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Di episode 4 kalian menguasai sintaks dasar C#. Sekarang waktunya memodelkan dunia nyata dalam kode dengan OOP (Object-Oriented Programming). Episode 5 membedah class, encapsulation, inheritance, polymorphism, interface, dan abstraksi — lalu menutupnya dengan fitur modern seperti record types dan tuple.

Penting untuk dipahami: OOP di C# bukan hanya soal sintaks, tetapi disiplin desain. Encapsulation melindungi state, interface memisahkan kontrak dari implementasi, dan record types membuat data immutable dengan ringkas. Pola-pola ini akan dipakai terus di episode 8 (dependency injection) dan episode 16 (arsitektur lanjutan).

Class, Object, dan Encapsulation

Membangun Class dengan Properties

Class adalah cetak biru, dan object adalah instance-nya. Property memaparkan state dengan cara terkontrol. Access modifier menentukan tingkat akses:

Class dengan encapsulation
public class Rekening
{
    private decimal _saldo;
 
    public string Pemilik { get; set; }
    public decimal Saldo => _saldo;
 
    public void Setor(decimal jumlah)
    {
        if (jumlah <= 0) throw new ArgumentException("Jumlah tidak valid");
        _saldo += jumlah;
    }
}

Field _saldo bersifat private — hanya method di dalam class yang bisa mengubahnya. Property Saldo hanya bisa dibaca dari luar. Inilah encapsulation: state internal dilindungi dan semua perubahan melewati method Setor yang memvalidasi input.

Konstruktor dan Object Initializer

Object dibuat dengan new, dan nilai property bisa diisi lewat object initializer:

Membuat object
var rekening = new Rekening { Pemilik = "Arman" };
rekening.Setor(100_000m);
Console.WriteLine(rekening.Saldo);

new Rekening { Pemilik = "Arman" } memakai object initializer untuk mengisi property saat pembuatan. Nilai underscore 100_000 adalah digit separator yang membuat angka besar mudah dibaca.

Inheritance dan Polymorphism

Abstract Class untuk Abstraksi Dasar

Inheritance memungkinkan sebuah class mewarisi perilaku dari class lain. Abstract class mendefinisikan kontrak sebagian — berisi implementasi bersama dan method abstrak yang wajib diturunkan:

Abstract class dan inheritance
public abstract class Hewan
{
    public abstract string Bersuara();
}
 
public class Kucing : Hewan
{
    public override string Bersuara() => "Meow";
}
 
public class Anjing : Hewan
{
    public override string Bersuara() => "Guk";
}

Kucing : Hewan mewarisi dari Hewan, dan override mengganti perilaku abstract Bersuara. Polymorphism berarti kode yang bekerja pada Hewan otomatis bekerja pada semua turunannya.

Interface untuk Kontrak Perilaku

Interface mendefinisikan kontrak tanpa implementasi. Satu class bisa mengimplementasikan banyak interface, mengatasi keterbatasan single inheritance:

Interface untuk kontrak
public interface IPembayaran
{
    bool Proses(decimal jumlah);
}
 
public class PembayaranKartu : IPembayaran
{
    public bool Proses(decimal jumlah) => true;
}

Gunakan interface saat kalian ingin memisahkan kontrak dari implementasi — ini adalah bahan utama dependency injection di episode 8. Abstract class untuk berbagi kode antar class yang berkaitan erat.

Record Types dan Immutable Objects

Record untuk Data yang Tidak Berubah

Record menyediakan value equality dan immutability secara ringkas. Dengan init-only property, nilai hanya bisa diisi saat konstruksi:

Record type
public record Produk(int Id, string Nama, decimal Harga);
 
var produk = new Produk(1, "Laptop", 15_000_000m);
var produkBaru = produk with { Harga = 14_500_000m };

with expression membuat salinan record dengan sebagian nilai diubah — record asli tidak berubah. Dua record dengan nilai sama dianggap equal. Ini membuat record ideal untuk value objects dan DTO yang dikirim antar layanan.

Pattern Matching, Tuples, dan Deconstruction

Tuple dan Deconstruction

Tuple mengelompokkan beberapa nilai tanpa membuat class. Deconstruction membongkar nilai menjadi variabel terpisah:

Tuple dan deconstruction
var hasil = (Lat: -6.2, Lng: 106.8);
var (lat, lng) = hasil;
 
Console.WriteLine(lat);
Console.WriteLine(lng);

(Lat: -6.2, Lng: 106.8) membuat tuple bernama, dan var (lat, lng) = hasil mendekonstruksinya. Record juga bisa didekonstruksi jika semua property ada di positional parameter.

Pattern Matching pada Object

Pattern matching tidak terbatas pada switch — ia bisa memeriksa tipe dan property sekaligus:

Pattern matching pada object
string Deskripsi(IPembayaran p) => p switch
{
    PembayaranKartu => "Kartu",
    _ => "Lainnya"
};

Pola PembayaranKartu => "Kartu" mencocokkan tipe object. Dengan kombinasi record, pattern matching, dan switch expression, C# mampu menulis logika domain yang deklaratif dan mudah dibaca.

Tip

Gunakan record untuk data murni, class untuk perilaku dengan state, dan interface untuk kontrak antar modul. Kombinasi ini menjaga model kalian tetap sederhana.

Panduan Memilih

Ringkasan keputusan desain:

  • Class: perilaku dengan state mutable dan identitas.
  • Record: data immutable dengan value equality.
  • Interface: kontrak yang bisa diimplementasikan banyak class.
  • Abstract class: perilaku bersama yang diturunkan class terkait.
  • Tuple: pengelompokan nilai sementara tanpa tipe bernama.

Penutup

Inti yang harus dibawa pulang:

  • Encapsulation melindungi state lewat access modifier dan property.
  • Inheritance memakai abstract class; polymorphism memungkinkan satu kontrak banyak perilaku.
  • Interface mendefinisikan kontrak tanpa implementasi, ideal untuk DI.
  • Record menyediakan immutability dan value equality dengan ringkas.
  • with expression membuat salinan record dengan perubahan sebagian.
  • Tuple dan deconstruction mengelompokkan dan membongkar nilai.

Di episode 6 selanjutnya kita akan membahas exception handling dan debugging — try, catch, finally, custom exception, using declarations, pola dispose, debugging di VS Code, dan logging dasar dengan Microsoft.Extensions.Logging.

Belajar .NET - OOP & Core Programming Concepts | Belajar .NET