Object Oriented Programing di C# (OOP)

Pengantar OOP

Aplikasi berbasis windows dan web adalah program yang sangat kompleks yang menyajikan tampilan menarik kepada user dan menawarkan user interface yang kompleks dengan tombol, dropdown, popup menu, toolbox, dan masih banyak komponen yang lain. Dibelakang user interface tersebut masih ada hubungan bussiness prosess yang kompleks seperti misal hubungan antara Product, Customer, dan Order yang melibatkan banyak logika dan pengolahan data.

Untuk menangani berbagai kompleksitas yang terjadi maka programmer mengembangkan teknik yang diberi nama “Objcet Oriented Programming”, dengan tujuan yang sederhana yaitu mengatur kompleksitas dengan memodelkan aspek esensial yang ada. Jika model yang dikembangkan semakin mendekati problem yang akan dipecahkan maka semakin mudah *** persoalan tersebut dapat dimengerti sehingga program lebih mudah ditulis dan di-maintain.

Problem yang akan dipecahkan dan semua informasi yang berhubungan dengan problem tersebut sering disebut sebagai problem domain. Misal jika anda ingin membuat program untuk keperluan Inventory dan Sales di suatu perusahaan maka problem domainnya adalah semua informasi tentang perusahaan tersebut yang berhubungan dengan pengaturan stok inventory, cara penjualan, pemasukan penjualan dan data lainnya. Manaager penjualan dan Manager bagian gudang akan menjadi problem domain expert yang dapat membantu anda dalam menyelesaikan masalah.

Design dari Object Oriented harus berisi objek-objek yang ada pada problem domain tersebut. Sebagai contoh jika problem domainnya adalah mesin ATM maka objek didalamnya seharusnya adalah customer, rekening, dll.

Pedrbedaan Class dan Object

Jika anda ingin membangun rumah Class adalah blueprint / gambar (berisi spesifikasi lengkap dari rumah yang akan dibuat, ukuran, jumlah, dll). Sedangkan object adalah bentuk fisik / rumah yang dibangun berdasarkan blueprint / class yang sudah ada, biasa disebut instan class / object.

Elemen Pada Class

Class pada C# terdiri dari :

· Instance Variable / Field

· Method

Method digunakan untuk merubah state pada field.

Mendefinisikan Class

Class di C# dapat terdiri dari kumpulan variable (field), property dan method. Cara untuk menggunakan class adalah dengan membuat instan class-nya. Untuk menjalankan class maka harus ada satu method main pada class tersebut. contoh pendeklarasian class di C# sebagai berikut:

   1: public class Time

   2: {

   3:    // private variables atau field

   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 methods

  12:   public void DisplayCurrentTime()

  13:   {

  14:       Console.WriteLine(“Menampilkan Waktu..”);

  15:   }

  16: }

  17:    

  18: class Program

  19: {

  20: static void Main(string[] args)

  21:       {

  22:              Time timeObject = new Time(); //membuat instan class

  23:              timeObject.DisplayCurrentTime(); //memanggil method dalam class

  24:       }

  25: }

C# Modifier

C# memiliki beberapa modifier class yaitu:

 

Image

Access Modifiers

Access Modifiers digunakan untuk menentukan hak akses dari class dan method, adapun access modifier yang ada pada C# sebagai berikut:

Image

Method Arguments

Method pada C# dapat memiliki banyak argumen dengan tipe data yang berbeda. Method juga dapat memiliki nama yang sama asal parameter / tipe datanya berbeda (Method Overloading).

   1: class MyClass {

   2:         public void SomeMethod(int firstParam, double secondParam) {

   3:             Console.WriteLine(“Parameter 1 : {0} dan parameter 2 : {1}”,

   4:                 firstParam, secondParam);                   

   5:         }

   6: 

   7:         //overload method

   8:         public void SomeMethod(int firstParam) {

   9:             Console.WriteLine(“Parameter 1 : {0}”, firstParam);

  10:         }

  11: 

  12:         public void SomeMethod(int firstParam, string secondParam) {

  13:             Console.WriteLine(“Parameter 1 : {0} dan parameter 2 : {1}”,

  14:                 firstParam, secondParam);

  15:         }

  16:     }

  17: 

  18:     class MethodArgumen {

  19:         static void Main(string[] args) {

  20:             MyClass m1 = new MyClass(); //membuat instan object

  21:             m1.SomeMethod(12, 1.25);

  22:             m1.SomeMethod(34);

  23:             m1.SomeMethod(12, “Hello”);

  24:         }

  25:     }

Konstruktor

Konstruktor adalah method yang namanya sama dengan nama class-nya. Konstruktor digunakan untuk inisialisasi variabel ketika membuat instan class / objek baru. Sebenarnya setiap kali anda membuat instant class / objek baru maka konstruktor dijalankan. Jika anda tidak mendefinisikan konstruktor secara eksplisit maka tetap dianggap membuat konstruktor kosong. Konstruktor juga dapat di-overload (anda dapat membuat konstruktor lebih dari satu asal parameternya jumlahnya beda atau tipe datanya beda). Variabel dalam class harus diinisialisasi, nilai defaultnya adalah

Image

   1: public class Time {

   2:         // private member variables

   3:         int Year;

   4:         int Month;

   5:         int Date;

   6:         int Hour;

   7:         int Minute;

   8:         int Second;

   9: 

  10:         // constructor

  11:         public Time(System.DateTime dt) {

  12:             Year = dt.Year;

  13:             Month = dt.Month;

  14:             Date = dt.Day;

  15:             Hour = dt.Hour;

  16:             Minute = dt.Minute;

  17:             Second = dt.Second;

  18:         }

  19: 

  20:         // public methods

  21:         public void DisplayCurrentTime() {

  22:             System.Console.WriteLine(“{0}/{1}/{2} {3}:{4}:{5}”,

  23:               Month, Date, Year, Hour, Minute, Second);

  24:         }

  25:        

  26:     }

  27: 

  28:     class LatKonstruktor {

  29:         public static void Main(string[] args) {

  30:             DateTime currTime = DateTime.Now;

  31:             Time t = new Time(currTime); //memanggil constructor

  32:             t.DisplayCurrentTime();

  33:         }

  34:     }

Initializer

Pada C# anda bisa menginisialisasi variabel dalam class secara langsung tanpa harus mengisialisasi-nya lewat konstruktor.

   1: public class Time

   2: {

   3:        // private member variables

   4:        int year;

   5:        int month;

   6:        int date;

   7:        int hour;

   8:        int minute;

   9:        int second = 30; //initializer

  10: }

“This” Keyword

This keyword digunakan untuk mengakses instan class / objek itu sendiri, penggunaan keyword this diperlukan untuk membedakan pengaksesan class variabel dan method variabel yang mempunyai nama yang sama.

   1: public class Time {

   2: // private member variables, class variable

   3: int year;

   4: int month;

   5: int date;

   6: int hour;

   7: int minute;

   8: int second = 30;

   9: 

  10: public void SetTime(year, month, date, newHour, newMinute, newSecond) {

  11:       this.year = year;         // penggunaan “this” dibutuhkan

  12:       this.month = month;       // dibutuhkan

  13:       this.date = date;         // dibutuhkan

  14:       this.hour = hour;         // penggunaan “this” optional

  15:       this.minute = newMinute;  // optional

  16:       second = newSecond;       // optional

  17: }

  18: } 

Static dan Instance Member

Field, property, dan method dalam suatu class bisa merupakan instance member atau static member. Instance member dibentuk ketika class tersebut dibuat instan-nya, secara default field, property, dan method yang tidak diberi keyword static merupakan instance member.

Static member tidak berhubungan dengan instan class melainkan langsung berhubungan dengan class tersebut. Dengan menggunakan keyword static anda dapat mengakses field, property, atau method pada suatu class tanpa harus membuat instan class-nya.

   1: public class Kucing {

   2:     private static int instances = 0;

   3:     public Kucing() {

   4:         instances++;

   5:     }

   6:     public static void BanyakKucing() {

   7:         Console.WriteLine(“Banyak Kucing : {0}”, instances);

   8:     }

   9: }

  10: 

  11: class StaticMember {

  12:    public static void Main(string[] args) {

  13:         Kucing meong1 = new Kucing();

  14:         Kucing.BanyakKucing();

  15:         Kucing meong2 = new Kucing();

  16:         Kucing meong3 = new Kucing();

  17:         Kucing.BanyakKucing();

  18:     }

  19: }

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.

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:     }

Inheritance

Pada C# hubungan spesialisasi diimplementasikan menggunakan prinsip inheritance. Penulisan inheritance di C# sebagai berikut

public class ListBox : Window

Kode diatas berarti class ListBox adalah turunan dari class Window

Penggunaan inheritance dapat dilihat pada program dibawah ini

   1: public class Window {
   2:         //variabel dideklarasikan private sehingga tidak bisa diakses oleh kelas 
   3:         //turunannya
   4:         private int top;
   5:         private int left;
   6:  
   7:         //objek konstruktor
   8:         public Window(int top, int left) {
   9:             this.top = top;
  10:             this.left = left;
  11:         }
  12:  
  13:         public void DrawWindow() {
  14:             Console.WriteLine("Draw window pada ({0},{1})",
  15:                 top, left);
  16:         }
  17: }
  18:  
  19:     public class ListBox : Window {
  20:         //member variable baru pada class anak
  21:         private string listBoxContent;
  22:         public ListBox(int top, int left, string contents):base(top,left) {
  23:             this.listBoxContent = contents;
  24:         }
  25:  
  26:         //versi baru karena override dari base classnya
  27:         public new void DrawWindow() {
  28:             base.DrawWindow();
  29:             Console.WriteLine("Menuliskan string pada listbox: {0}", 
  30:             listBoxContent);
  31:         }
  32:     }
  33:  
  34:     class LatInheritance {
  35:         public static void Main(string[] args) {
  36:             Window objWindow = new Window(10, 15);
  37:             objWindow.DrawWindow();
  38:  
  39:             ListBox objList = new ListBox(15, 20, "Hello ListBox");
  40:             objList.DrawWindow();
  41:         }
  42:     }

Abstract Class

Abstract method tidak mempunyai implementation, abstract method hanya semacam kontrak yang harus dipenuhi. Semua class yang diturunkan dari class yang mempunyai abstract method harus mengimplementasikan method tersebut.

Class yang didefinisikan sebagai abstract class tidak dapat dibuat instan class / objek, class yang didefinisikan abstract hanya dapat digunakan dengan cara diturunkan.

   1: public abstract class Control {

   2:         private int top;

   3:         private int left;

   4: 

   5:         protected int Top {

   6:             get { return this.top;}

   7:             set { this.top = value;}

   8:         }

   9:         protected int Left {

  10:             get {return this.left;}

  11:             set {this.left = value;}

  12:         }

  13:         public Control(int top, int left) {

  14:             Top = top;

  15:             Left = left;

  16:         }

  17:         //abstract method harus diimplementasikan

  18:         public abstract void DrawWindow();

  19:     }

  20: 

  21:     public class ListBox : Control {

  22:         private string listBoxContent;

  23:         public ListBox(int top, int left, string contents)

  24:             : base(top, left) {

  25:             this.listBoxContent = contents;

  26:         }

  27: 

  28:         public override void DrawWindow() {

  29:             Console.WriteLine(“Position :({0},{1})”, Top, Left);

  30:             Console.WriteLine(“Menuliskan string pada listbox: {0}”,

  31:               listBoxContent);

  32:         }

  33: 

  34:     }

  35: 

  36:     public class Button : Control {

  37:         public Button(int top, int left) : base(top, left) { }

  38:         public override void DrawWindow() {

  39:             Console.WriteLine(“Menggambar button pada ({0},{1})”, Top, Left);

  40:         }

  41:     }

  42:     class LatAbstract {

  43:         static void Main(string[] args) {

  44:             Control[] winArray = new Control[3];

  45:             winArray[0] = new ListBox(5, 10, “Pada ListBox”);

  46:             winArray[1] = new Button(5, 6);

  47:             for (int i = 0; i < 2; i++) {

  48:                 winArray.DrawWindow();

  49:             }

  50:         }

  51:     }

Tapi untuk kasus diatas abstract masih mempunyai keterbatasan, jika anda ingin membuat class DropDownList yang hendak diturunkan dari class ListBox, maka anda tidak dapat memaksakan method DrawWindow() harus ada di class tersebut. 

Object Root dari semua class

Semua class dari semua type diturunkan dari satu class untama yaitu class object. Meskipun tidak dituliskan secara eksplisit namun pada dasarnya semua class diturunkan dari class object.

Beberapa method yang ada pada class object adalah: Equals(), GetHashCode(), GetType(), ToString(), Finalize(), MemberwiseClone(), ReferenceEquals().

Method dari class yang ada diatas dapat dioverride oleh semua class karena pada dasarnya semua class diturunkan dari class object.

   1: public class Cat {

   2:         private int weight;

   3:         public Cat(int weight) {

   4:             this.weight = weight;

   5:         }

   6: 

   7:         public override string ToString() {

   8:             return weight.ToString();

   9:         }

  10:     }

  11:     class LatObject {

  12:         static void Main(string[] args) {

  13:             Cat catty = new Cat(60);

  14:             Console.WriteLine(“Berat si catty : ” + catty);

  15:         }

  16:     }

 

Tinggalkan komentar