Posting ini adalah lanjutan dari posting saya yang sebelumnya tentang OOP dengan C# (Bagian 1)
Topik yang dibahas
- Destroy Object
- Mengunakan Using Statement
- Passing Parameter
- Overloading Konstruktor dan Method
- Enkapsulasi data dengan property
- Gen dan Set Accessor
Destroy Object
Karena C# menyediakan garbage collector, anda tidak perlu secara eksplisit men-destroy objek. Jika anda bekerja dengan unmanage resource (kode yang tidak di handle oleh CLR) maka anda tetap harus mendestroy objek secara manual. Adapun cara pendeklarasian destruktor pada C# sebagai berikut:
1: ~MyClass( ){ 2: // perintah disini
3: }
Jika anda menggunakan managed code pada C# maka anda tidak diperbolehkan untuk mendestroy object secara langsung karena pada managed code, destroy object sudah diatur oleh komponen garbage collector pada CLR. Untuk men-destroy objek secepat mungkin setelah tidak diperlukan lagi anda dapat menggunakan interface IDisposable.
1: class Testing : IDisposable { 2: bool is_disposed = false;
3: protected virtual void Dispose(bool disposing) { 4: if (!is_disposed) { //hanya sekali dispose 5: if (disposing) { 6: Console.WriteLine(
7: "Sudah di dispose tanpa masuk ke desktruktor");
8: }
9: //bersihkan objectnya disini
10: Console.WriteLine("Disposing..."); 11: }
12: this.is_disposed = true;
13: }
14:
15: public void Dispose() { 16: Dispose(true);
17: GC.SuppressFinalize(this);
18: }
19:
20: ~Testing(){ 21: Dispose(false);
22: Console.WriteLine("Didalam destruktor"); 23: }
24: }
25:
26: class LatDispose { 27: public static void Main(string[] args) { 28: Testing t1 = new Testing();
29: t1.Dispose();
30: }
31: }
Menggunakan Using Statement
Untuk memudahkan developer C# menyediakan statement using untuk memastikan bahwa method dispose dijalankan. (kadang kita lupa untuk memanggil method dispose ini). Penggunaan using hanya bisa digunakan untuk class yang mengimplementasikan IDisposable.
1: class LatDispose { 2: public static void Main(string[] args) { 3: using (Testing t1 = new Testing()) { 4: Console.WriteLine("Menggunakan Keyword Using.."); 5: }
6: }
7: }
Passing Parameter
Parameter pada C# secara default yang dikirimkan kedalam method adalah nilainya, atau “pass by value”. Jadi jika ada perubahan nilai parameter pada method tersebut tidak berpengaruh ke method.
1: public class Time { 2: // private member variables
3: private int Year;
4: private int Month;
5: private int Date;
6: private int Hour;
7: private int Minute;
8: private int Second;
9:
10: public void DisplayCurrentTime() { 11: System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}", 12: Month, Date, Year, Hour, Minute, Second);
13: }
14:
15: public int GetHour() { 16: return Hour;
17: }
18:
19: public void GetTime(int h, int m, int s) { 20: h = Hour;
21: m = Minute;
22: s = Second;
23: }
24:
25: public Time(System.DateTime dt) { //konstruktor 26: Year = dt.Year;
27: Month = dt.Month;
28: Date = dt.Day;
29: Hour = dt.Hour;
30: Minute = dt.Minute;
31: Second = dt.Second;
32: }
33:
34: class MethodByReference { 35:
36: public static void Main(string[] args) { 37: System.DateTime currentTime = System.DateTime.Now;
38: Time t = new Time(currentTime);
39: t.DisplayCurrentTime();
40:
41: int theHour = 0;
42: int theMinute = 0;
43: int theSecond = 0;
44: t.GetTime(theHour, theMinute, theSecond);
45: System.Console.WriteLine("Current time: {0}:{1}:{2}", 46: theHour, theMinute, theSecond);
47: }
48: }
49: }
Jika ingin mengirimkan parameter referenced / ‘pass by reference’ anda dapat menambahkan keyword ref sebelum tipe data pada method parameternya.
1: //tambahkan keyword ref pada parameter
2: public void GetTime(ref int h,ref int m,ref int s) { 3: h = Hour;
4: m = Minute;
5: s = Second;
6: }
7:
8: //pada method main tambahkan ref pada method pemanggil
9: int theHour = 0;
10: int theMinute = 0;
11: int theSecond = 0;
12: t.GetTime(ref theHour, ref theMinute, ref theSecond);
13: System.Console.WriteLine("Current time: {0}:{1}:{2}", 14: theHour, theMinute, theSecond);
Overloading Konstruktor & Method
Pada C# anda dapat mendeklarasikan method atau konstruktor dengan nama yang sama pada sebuah class, tetapi parameter method tersebut harus berbeda bisa jumlah atau tipe datanya. Pada contoh dibawah ini akan ditunjukan bagaimana cara menggunakan overloading konstruktor
1: public class Time
2: { 3: // private member variables
4: private int Year;
5: private int Month;
6: private int Date;
7: private int Hour;
8: private int Minute;
9: private int Second;
10:
11: // public accessor methods
12: public void DisplayCurrentTime()
13: { 14: System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}", 15: Month, Date, Year, Hour, Minute, Second);
16: }
17: // constructors
18: public Time(System.DateTime dt)
19: { 20: Year = dt.Year;
21: Month = dt.Month;
22: Date = dt.Day;
23: Hour = dt.Hour;
24: Minute = dt.Minute;
25: Second = dt.Second;
26: }
27: public Time(string strTime) // overloading konstruktor
28: { 29: Console.WriteLine(strTime);
30: }
31:
32: public Time(int Year, int Month, int Date,
33: int Hour, int Minute, int Second) // overloading konstruktor
34: { 35: this.Year = Year;
36: this.Month = Month;
37: this.Date = Date;
38: this.Hour = Hour;
39: this.Minute = Minute;
40: this.Second = Second;
41: }
42: }
43:
44: class Tester
45: { 46: public void Run()
47: { 48: System.DateTime currentTime = System.DateTime.Now;
49: Time time1 = new Time(currentTime);
50: time1.DisplayCurrentTime();
51: Time time2 = new Time(2000, 11, 18, 11, 03, 30);
52: time2.DisplayCurrentTime();
53: }
54:
55: static void Main()
56: { 57: Tester t = new Tester();
58: t.Run();
59: }
60: }
Selain konstruktor overloading juga bisa diterapkan pada method dalam suatu class yang sama, contoh penulisannya:
1: void MyMethod(int p1);
2: void MyMethod(int p1, int p2); // beda banyak parameter
3: void MyMethod(int p1, string s1); // beda tipe data
Enkapsulasi data dengan Property
Enkapsulasi / penyembunyian informasi adalah konsep yang selama ini sering anda dengar. Pada OOP informasi dibungkus dalam sebuah Class sehingga orang yang menggunakan class tersebut tidak perlu tahu detail-nya, hanya cukup mengetahui method dan property apa saja yang ada dalam class tersebut beserta kegunaannya.
Pada pemrograman berorientasi objek variabel dalam class biasanya diberi access modifier private, ini berarti hanya method dalam class tersebut yang dapat mengakses variabelnya. Yang menjadi pertanyaan bagaimana cara anda mengakses variabel bertipe private tersebut? Mengapa harus dibuat private?
Jika anda membuat variable tersebut public maka user yang menggunakan class tersebut bisa memasukan nilai yang tidak kita inginkan, maka anda harus mendeklarasikan variable tersebut secara private agar pada saat setMethod() anda dapat menambahkan validasi inputan dari user.
Anda bisa membuat public method set dan get untuk memberi dan mengambil nilai variabel tersebut, misal:
1: // private member variables
2: private int Year;
3:
4: public int getYear() //get method
5: { 6: return this.Year;
7: }
8:
9: public void setYear(int Year) //set method
10: { 11: this.Year = Year;
12: }
Selain menggunakan cara tersebut diatas pada C# disediakan object property untuk memberi nilai dan mengambil nilai dari private variabel dalam suatu class. Penggunaan object property lebih memudahkan anda dalam penulisan kode dibandingkan harus membuat dua method set dan get untuk mengakses satu variabel private. Contoh penggunaan property dapat dilihat pada contoh kode dibawah ini.
1: class Mahasiswa { 2: private string nim;
3: private string nama;
4:
5: public string Nim { 6: get { 7: return nim;
8: }
9: set { 10: this.nim = value;
11: }
12: }
13:
14: public string Nama { 15: get { 16: return nama;
17: }
18: set { 19: this.nama = value;
20: }
21: }
22:
23: public string DisplayInfo() { 24: return Nim + " " + Nama;
25: }
26: }
27:
28: class ClassProperty { 29: public static void Main(string[] args) { 30: Mahasiswa mhs1 = new Mahasiswa();
31: mhs1.Nim = "22002321";
32: mhs1.Nama = "Erick";
33: Console.WriteLine(mhs1.DisplayInfo());
34: }
35: }
Get Accessor
Penggunakan get{} pada property mirip dengan jika anda menggunaan method getValue() / getter method pada java, get pasti mengembalikan nilai jadi dalam kalang get harus ada return valuenya.
Set Accessor
Penggunaan set{} pada property mirip dengan jika anda menggunakan setValue() / setter method pada java, set digunakan untuk memberi nilai kedalam class variable. Pada C# jika anda memberi nilai pada property maka set{} otomatis dijalankan.