Class dan objek pada C#

Bagian ini adalah permulaan dari Object Oriented Programming (OOP). Ada banyak konsep mengenai OOP seperti Abstraction, Encapsulation, Inheritance dan Polymorphism. Di bawah ini adalah penjelasan mengenai Abstraction dan Encapsulation. Meskipun memahami konsep ini dapat berguna, apabila Anda sedang buru-buru, lewati saja penjelasan tersebut sampai ke bagian class pada C#.

Abstraction

Abstraction atau dalam bahasa Indonesia Abstraksi, bukanlah mengenai kode program. Abstraksi hanyalah suatu proses dimana seorang programmer melihat contoh-contoh di kehidupan nyata dan menterjemahkan konsep-konsep yang didapat ke dalam suatu program. Sebagai contoh, seorang programmer game mula-mula akan melihat suatu mobil memiliki kecepatan, jumlah bensin dan jenis bannya. Sedangkan programmer retailer otomotif mungkin akan lebih peduli dengan harga, warna dan mereknya. Tentu saja mereka dapat memasukkan semua hal tersebut dan hal lainnya ke dalam program. Akan tetapi hal ini sangat bergantung dengan apa yang dilihat oleh programmer.

Encapsulation

Pernahkah Anda melihat kapsul? Benda mengkilat yang kita makan ketika kita sakit. Sesungguhnya, bagian mengkilatnya hanya bagian luarnya. Di dalamnya terdapat banyak jenis obat dan vitamin yang membuat kita lebih sehat. Ada dua hal yang terkait dengan fakta ini:

  • Kita tidak tahu apa yang ada di dalam kapsul. Kita hanya tahu manfaat dan cara kerja kapsul tersebut (ditelan).
  • Memakan satu kapsul berarti memakan semua obat dan vitamin di dalamnya sekaligus.

Dengan cara yang sama, suatu class mengkapsulkan semua hal di dalamnya:

  • Pengguna class tidak perlu tahu bagian dalam dari class, mereka cukup tahu kegunaan class tersebut.
  • Membuat suatu objek class tertentu berarti objek tersebut memiliki semua properties, method, enum dan event di dalam class tersebut.

Class pada C#

Kita mendefinisikan class di dalam namespace pada C#. Untuk mendefinisikan suatu class sederhana, kita tuliskan dalam namespace:

[access modifier] class [nama class] {
    //Member-member pada class
}

Access modifiers pada C# akan dijelaskan terakhir pada bagian ini. Untuk sekarang, cukup gunakan public untuk semua class. Sebagai contoh, kita dapat membuat class Mobil sebagai berikut:

namespace Belajar1 {
  class Program {
    static void Main(string[] args) {
      
    }
  }

  public class Mobil {
    public double kecepatan;
    public double bensin;
    public double posisi;
    public string nama;

    public void percepat() {
      this.kecepatan += 10;
      this.bensin -= 5;
    }
    public void maju() {
      this.posisi += this.kecepatan;
      this.bensin -= 2;
    }
    public void isiBensin(double bensin) {
      this.bensin += bensin;
    }
  }
}

Perhatikan bahwa class Mobil berada di dalam namespace Belajar1 setingkat dengan class Program (dalam hal level kurung kurawalnya). Di sini kita telah melakukan proses abstraksi. Pada class Mobil di atas, kecepatan, bensin, posisi dan nama adalah fields, sedangkan percepat, maju dan isiBensin adalah method. Field, Property dan Mehtod akan dijelaskan lain kali.

Objek pada C#

Suatu class digunakan untuk membuat objek. Untuk membuat objek, kita meng-instantiate suatu class dengan salah satu dari cara berikut:

[nama class] [nama objek] = new [nama class]();
[nama class] [nama objek] = new [nama class]() { field1=nilai1, field2=nilai2, ... };
[nama class] [nama objek] = new [nama class](param1, param2, ...);

Ketika kita membuat suatu objek dari suatu class, kita mendapatkan semua member dari class tersebut. Kita dapat mengkases member class tersebut dengan mengetikkan titik dan nama member yang bersangkutan. Sebagai contoh, kita tuliskan dalam class Program:

  class Program {
    static void Main(string[] args) {
      Mobil SuatuMobil = new Mobil();
      Mobil MobilSaya = new Mobil() { nama = "Ferrari", kecepatan = 0, bensin = 30000, posisi = 0 };
      MobilSaya.Percepat();
      Console.WriteLine(SuatuMobil.nama);
      Console.WriteLine(SuatuMobil.bensin);

      Console.WriteLine(MobilSaya.nama);
      Console.WriteLine(MobilSaya.bensin);
      Console.ReadKey();
    }
  }

Program di atas akan menampilkan:

[baris kosong]
0
Ferrari
30000

Baris pertama kosong dan baris kedua bernilai 0 karena nilai default string dan int. Perlu diingat bahwa tidak baik untuk menggunakan variabel (field nama dan bensin) tanpa menginisialisasinya, akan tetapi program di atas hanyalah contoh. Inilah yang saya suka dari objek. Kita cukup menuliskan new Mobil() satu kali, dan di dalam objek tersebut kita sudah mendapatkan semua yang kita definisikan di dalam class Mobil.

Constructor pada C#

Hampir selalu, kita perlu memberi nilai pada field atau property suatu objek sebelum kita dapat menggunakannya. Untuk itu, kita gunakan method constructor. Suatu constructor didefinisikan dengan cara:

public [nama class] (param1, param2, ...) {
    //Hal-hal yang dilakukan ketika suatu objek diinstantiate (dibuat)
}

Sebagai contoh, tambahkan kode berikut ke dalam class Mobil:

    public Mobil(string nama, double kecepatan, double bensin) {
      this.nama = nama;
      this.kecepatan = kecepatan;
      this.bensin = bensin;
      this.posisi = 0;
    }

Constructor di atas menerima tiga parameter. Parameter yang diberikan digunakan untuk menginisialisasi field-field di dalam objek. Perhatikan bahwa variabel this.nama dengan variabel nama di atas adalah dua variabel yang berbeda. Keyword "this" pada C# mewakili objek yang sedang aktif pada class. Ketika tidak ada parameter "nama", variabel "nama" akan mewakili field "nama" pada class. Akan sama saja apabila kita menulis "this.name" atau "name". Akan tetapi apabila parameter ada "nama", "nama" akan mewakili parameter tersebut, dan untuk mewakili field nama, kita hanya dapat menggunakan "this.nama". Untuk menggunakan constructor untuk membuat objek, kita menggunakan kode seperti berikut:

      Mobil MobilAnda = new Mobil("Lamborghini", 300, 50000);

Perhatikan bahwa karena constructor baru kita, perintah-perintah new Mobil() sebelumnya menjadi error karena kita telah mendeklarasikan constructor kita. Kita dapat membuat constructor lain di dalam class Mobil untuk menghindari error tersebut:

    public Mobil() {
      this.nama = "";
      this.kecepatan = 0;
      this.bensin = 0;
      this.posisi = 0;
    }

Menurut pendapat saya, membuat constructor kosong seperti ini berbahaya karena membuat kita dapat lupa mengisi field di dalam objek kita.

Destructor pada C#

Meskipun constructor sangatlah penting, Saya tidak pernah benar-benar menggunakan kebalikannya: Destructor di dalam suatu program. Tujuan utama dari destructor biasanya untuk membebaskan memoi. Akan tetapi dikarenakan C# sudah memiliki "garbage collector" untuk membebaskan memori yang tidak digunakan lagi, destructor sangat jarang digunakan. Untuk membuat suatu destructor, cukup membuat suatu method dengan nama yang sama dengan nama class diawali dengan tanda tilde (~). Sebagai contoh:

    ~Mobil() {
      Console.WriteLine("Mobil " + nama + " telah dihancurkan");
    }

Access modifier pada C#

Access modifier menentukan apakah suatu class, method, field, property, event atau hal-hal lainnya dapat diakses di luar class induknya.

  • public membuat member yang bersangkutan dapat diakses dari mana saja.
  • private membuat member yang bersangkutan hanya dapat diakses dari dalam class itu sendiri.
  • protected membuat member yang bersangkutan hanya dapat diakses dari class itu sendiri atau class lain yang merupakan turunan (inherits) dari class yang bersangkutan.
  • internal membuat member yang bersangkutan hanya dapat diakses dari assembly yang sama, atau dengan kata lain, aplikasi yang sama.
  • protected internal menggabungkan protected dan internal, yang berarti member yang bersangkutan hanya dapat diakses dari class itu sendiri atau dari class lain dari dalam assembly yang sama yang merupakan turunan dari class yang bersangkutan.

Perlu diketahui bahwa class puncak yang langsung berada di bawah suatu namespace hanya dapat dideklarasi public atau internal. Mereka tidak dapat dideklarasi private, protected atau protected internal. Hanya class di dalam class lain yang dapat dideklarasi seperti itu. Perlu diketahui juga bahwa kata kunci static dan virtual bukanlah suatu access modifier.