Object Oriented Programming in C# (Part4)

Pada Turtorial keempat ini akan dibahas beberapa topik yaitu:

  • Abstract Class
  • Sealed Class
  • “Object” akar dari semua class
  • Boxing dan Unboxing Types
  • Interfaces

Abstract Class

Setiap tipe Window pasti mempunyai bentuk tampilan yang berbeda misal combobox, listbox, button, dll. Berarti setiap class turunan dari Window harus mempunyai method DrawWindow() nya sendiri yang berbeda satu sama lain. Untuk memastikan bahwa setiap class turunan harus mempunyai method tertentu maka anda harus mendefinisikan class tersebut sebagai abstract class dan memiliki method abstract.

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: //mendeklarasikan abstract class
   2:     public abstract class Window
   3:     {
   4:         //konstruktor
   5:         public Window(int top, int left)
   6:         {
   7:             this.top = top;
   8:             this.left = left;
   9:         }
  10:
  11:         //method abstract
  12:         public abstract void DrawWindow();
  13:
  14:         protected int top;
  15:         protected int left;
  16:     }     // end class Window
  17:
  18:     // ListBox diturunkan dari Window
  19:     public class ListBox : Window
  20:     {
  21:         // konstruktor
  22:         public ListBox(int top, int left, string contents)
  23:             : base(top, left) // memanggil konstruktor dari base class
  24:         {
  25:             listBoxContents = contents;
  26:         }
  27:
  28:         //implementasi method abstract pada class anak
  29:         public override void DrawWindow()
  30:         {
  31:             Console.WriteLine("Writing string to the listbox: {0}",
  32:             listBoxContents);
  33:         }
  34:         private string listBoxContents; // member variable yang baru
  35:     }     // end class ListBox
  36:
  37:     public class Button : Window
  38:     {
  39:         public Button(
  40:         int top,
  41:         int left)
  42:             : base(top, left) { }
  43:
  44:         // implementasi abstract method
  45:         public override void DrawWindow()
  46:         {
  47:             Console.WriteLine("Drawing a button at {0}, {1}\n",
  48:             top, left);
  49:         }
  50:     }        // end class Button
  51:
  52:     public class Tester
  53:     {
  54:         static void Main()
  55:         {
  56:             Window[] winArray = new Window[3];
  57:             winArray[0] = new ListBox(1, 2, "First List Box");
  58:             winArray[1] = new ListBox(3, 4, "Second List Box");
  59:             winArray[2] = new Button(5, 6);
  60:
  61:             for (int i = 0; i < 3; i++)
  62:             {
  63:                 winArray[i].DrawWindow();
  64:             }     // end for loop
  65:         }        // end main
  66:     }           // end class Tester

Sealed Class

Ini merupakan kebalikan dari abstract class, jika sebuah class dideklarasikan sebagai sebagai sealed class maka class tersebut tidak dapat diturunkan.

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:

image_thumb[8]

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

   1: public class Dog
   2:     {
   3:         private int weight;
   4:
   5:         // konstruktor
   6:         public Dog(int weight)
   7:         {
   8:             this.weight = weight;
   9:         }
  10:
  11:         // override dari Object.ToString
  12:         public override string ToString()
  13:         {
  14:             return weight.ToString();
  15:         }
  16:     }
  17:
  18:     public class Tester
  19:     {
  20:         static void Main()
  21:         {
  22:             int i = 5;
  23:             Console.WriteLine("The value of i is: {0}", i.ToString());
  24:
  25:             Dog milo = new Dog(62);
  26:             Console.WriteLine("My dog Milo weighs {0} pounds", milo);
  27:         }
  28:     }

Boxing dan Unboxing Types

Boxing dan Unboxing adalah suatu proses ketika suatu tipe data value (seperti int) di konversikan menjadi tipe reference / object. Istilah boxing berarti diubah menjadi object dan unboxing berarti dikembalikan lagi ke tipe data value.

Proses boxing dilakukan secara implisit jadi compiler otomatis akan melakukannya ketika kita mengisi nilai bertipe value kedalam variabel bertipe object.

image_thumb[9]

   1: int myIntegerValue = 5;
   2: object myObject = myIntegerValue; // cast to an object
   3: myObject.ToString();

Tidak seperti boxing, proses unboxing harus eksplisit. Ketika proses unbox kita harus tahu tipe data apa yang kita ingin konversikan dari tipe objek-nya.

image_thumb[10]

   1: int myIntegerVariable = 123;
   2:
   3: //Boxing
   4: object myObjectVariable = myIntegerVariable;
   5: Console.WriteLine( "myObjectVariable: {0}",
   6: myObjectVariable.ToString(  ) );
   7:
   8: // unboxing (harus explicit)
   9: int anotherIntegerVariable = (int)myObjectVariable;
  10: Console.WriteLine( "anotherIntegerVariable: {0}",
  11: anotherIntegerVariable );
  12:
  13: Output:
  14: myObjectVariable: 123
  15: anotherIntegerVariable: 123

Menghindari Boxing dengan Generic

Proses boxing dan unboxing mempengaruhi performa program, karena semua harus di boxing kedalam tipe object (misal: dalam penggunaan ArrayList). Pada C# 2.0 keatas sudah mendukung generic sehingga proses boxing dan unboxing dapat dihindari.

Interfaces

Jika anda ingin mendefinisikan tipe baru tetapi tidak ingin mengimplementasikan isinya secara langsung maka anda dapat menggunakan interfaces.

Pada dasarnya interface adalah sebuah kontrak, ketika anda mendesign interface seolah-olah anda mengatakan “jika anda ingin menggunakan fasilitas ini maka anda harus mengimplementasi method, dan property-nya”. Class yang menggunakan interface tersebut setuju dengan kontrak dan mengimplementasikan requirement yang ditentukan.

Perbedaan Interface dan Abstract Class

Programmer sering merasa bingung dalam mebedakan Interface dan Abstract Class. Beberapa perbedaannya adalah:

  • Cara penggunaan Abstract Class adalah diturunkan, sedangkan cara penggunaan Interface adalah diimplementasikan.
  • Pada C# lambang untuk menurunkan class dan menggunakan interfaces sama-sama menggunakan tanda “:” (titik dua). Tetapi untuk membedakan biasanya nama interface diawali dengan huruf I di depan misal: IEnumerable, IDisposable, dll.
  • Sebuah class hanya dapat diturunkan dari satu abstract class tapi dapat menggunakan lebih dari satu interfaces.
  • Method dan member variable pada abstract class boleh sudah ada isinya, sedangkan pada interfaces semua belum ada implementasinya.
  • Pada Abstract Class semua method / member variable yang abstract harus diimplementasikan di class turunannya.
  • Pada Interface semua member variable dan method harus diimplementasikan di class yang menggunakan interface tersebut.
  • Access Modifier pada method dan member variable di Interface secara implisit adalah public.
   1: //deklarasi interface
   2:     interface IStorable
   3:     {
   4:         void Read();
   5:         void Write(object obj);
   6:         int Status { get; set; }
   7:
   8:     }
   9:
  10:     public class Document : IStorable
  11:     {
  12:         // implementasi dari member variabel yang dideklarasikan di interface
  13:         private int status = 0;
  14:
  15:         public Document(string s)
  16:         {
  17:             Console.WriteLine("Creating document with: {0}", s);
  18:         }
  19:
  20:
  21:         //implementasi method yang ada pada interface
  22:         public void Read()
  23:         {
  24:             Console.WriteLine(
  25:             "Implementing the Read Method for IStorable");
  26:         }
  27:
  28:         public void Write(object o)
  29:         {
  30:             Console.WriteLine(
  31:             "Implementing the Write Method for IStorable");
  32:         }
  33:
  34:         public int Status
  35:         {
  36:             get { return status; }
  37:             set { status = value; }
  38:         }
  39:
  40:
  41:     }
  42:
  43:     class Tester
  44:     {
  45:         public void Run()
  46:         {
  47:             Document doc = new Document("Test Document");
  48:             doc.Status = -1;
  49:             doc.Read();
  50:             Console.WriteLine("Document Status: {0}", doc.Status);
  51:         }
  52:
  53:         static void Main()
  54:         {
  55:             Tester t = new Tester();
  56:             t.Run();
  57:         }
  58:     }
  59:
  60: Output:
  61: Creating document with: Test Document
  62: Implementing the Read Method for IStorable
  63: Document Status: -1

Mengimplementasikan lebih dari satu Interface

Pada C# sebuah class hanya dapat diturunkan dari sebuah class saja, tidak seperti bahasa C++ yang mendukung multipe inheritance. Tetapi untuk interface anda dapat tidak menggunakannya, menggunakan satu interface saja, atau menggunakan lebih dari satu interface.

   1: interface IStorable
   2:     {
   3:         void Read();
   4:         void Write(object obj);
   5:         int Status { get; set; }
   6:
   7:     }
   8:
   9:     // lebih dari satu interface
  10:     interface ICompressible
  11:     {
  12:         void Compress();
  13:         void Decompress();
  14:     }
  15:
  16:
  17:     public class Document : IStorable, ICompressible
  18:     {
  19:         private int status = 0;
  20:
  21:         public Document(string s)
  22:         {
  23:             Console.WriteLine("Creating document with: {0}", s);
  24:         }
  25:
  26:         #region IStorable
  27:
  28:         public void Read()
  29:         {
  30:             Console.WriteLine(
  31:             "Implementing the Read Method for IStorable");
  32:         }
  33:
  34:         public void Write(object o)
  35:         {
  36:             Console.WriteLine(
  37:             "Implementing the Write Method for IStorable");
  38:         }
  39:
  40:         public int Status
  41:         {
  42:             get { return status; }
  43:             set { status = value; }
  44:         }
  45:
  46:         #endregion     // IStorable
  47:
  48:         #region ICompressible
  49:
  50:         public void Compress()
  51:         {
  52:             Console.WriteLine("Implementing Compress");
  53:         }
  54:
  55:         public void Decompress()
  56:         {
  57:             Console.WriteLine("Implementing Decompress");
  58:         }
  59:
  60:         #endregion  // ICompressible
  61:     }
  62:
  63:
  64:     class Tester
  65:     {
  66:         public void Run()
  67:         {
  68:             Document doc = new Document("Test Document");
  69:             doc.Status = -1;
  70:             doc.Read();          // dipanggil dari method IStorable
  71:             doc.Compress();      // dipanggil dari method ICompressible
  72:             Console.WriteLine("Document Status: {0}", doc.Status);
  73:         }
  74:
  75:         static void Main()
  76:         {
  77:             Tester t = new Tester();
  78:             t.Run();
  79:         }
  80:     }
  81:
  82: Output:
  83: Creating document with: Test Document
  84: Implementing the Read Method for IStorable
  85: Implementing Compress
  86: Document Status: -1

pustaka: “Learning C# 2005”, Jesse Liberty, Brian MacDonald, O’Reilly 2006

Advertisement

Object Oriented Programming in C# (Part3)

Pada Turtorial ketiga ini akan dibahas beberapa topik yaitu:

  • Specialization dan Generalization
  • Inheritance
  • Memanggil Base Class Constructor
  • Polymorphism

Specialization dan Generalization

Class dan instannya (objek) tidak berdiri sendiri, seperti objek manusia yang merupakan mahluk sosial tidak hanya berdiri sendiri, objek akan saling berelasi dan berinteraksi, demikian pula pada OOP.

Salah satu hubungan antar objek yang paling penting yang terjadi di dunia nyata adalah spesialisasi yang bisa didefinisikan sebagai is-a relationship, misal anjing adalah mamalia, jika anjing termasuk anggota mamalia maka dia memiliki ciri-ciri special khas yaitu menyusui, punya bulu. Selain sifat-sifat pada mamalia anjing juga memiliki ciri yang spesifik khas anjing yang tidak dipunyai anggota mamalia lainnya seperti kucing.

Relasi spesialisasi dan generalisasi terjadi pada contoh diatas, anjing dan kucing secara general merupakan anggota mamalia tetapi juga terspesialisasi secara spesifik sebagai anjing dan kucing yang mempunyai ciri khas yang berbeda. Relasi tersebut dapat digambarkan secara hirarki.

Misal gambar dibawah akan menunjukan hirarki antara class window, button, dan listbox

image

Gambar diatas menunjukan relasi antara window, button, dan listbox. Button dan listbox sama-sama memiliki karakteristik yang dimiliki oleh window, tetapi button dan listbox juga memiliki ciri-ciri spesifik khas mereka sendiri. Contoh lain yang lebih rinci untuk menggambarkan spesialisasi dan generalisasi dapat digambarkan sebagai berikut:

image

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:     {
   3:         //objek konstruktor
   4:         public Window(int top, int left)
   5:         {
   6:             this.top = top;
   7:             this.left = left;
   8:         }
   9:
  10:         // simulasi menggambar pada windows
  11:         public void DrawWindow()
  12:         {
  13:             Console.WriteLine("Drawing Window at {0}, {1}",
  14:             top, left);
  15:         }
  16:
  17:         //variabel didefinisikan private sehingga 
  18:         //tidak dapat digunakan pada kelas turunannya
  19:         private int top;
  20:         private int left;
  21:     }
  22:
  23:     // ListBox diturunkan dari class Window
  24:     public class ListBox : Window
  25:     {
  26:         // menambahkan parameter pada konstruktor
  27:         public ListBox(int top, int left, string theContents) :
  28:             base(top, left) // call base constructor
  29:         {
  30:             mListBoxContents = theContents;
  31:         }
  32:
  33:         // new version (new keyword) karena
  34:         // pada method di kelas turunan dirubah isinya
  35:         public new void DrawWindow()
  36:         {
  37:             base.DrawWindow(); // memanggil dari base class
  38:             Console.WriteLine("Writing string to the listbox: {0}",
  39:             mListBoxContents);
  40:         }
  41:         private string mListBoxContents; // member variabel baru
  42:     }
  43:
  44:     public class Tester
  45:     {
  46:         public static void Main()
  47:         {
  48:             // membuat instan class baru
  49:             Window w = new Window(5, 10);
  50:             w.DrawWindow();
  51:
  52:             // membuat instan dari class turunan
  53:             ListBox lb = new ListBox(20, 30, "Hello world");
  54:             lb.DrawWindow();
  55:         }
  56:     }

Memanggil Base Class Constructor

Pada contoh diatas class ListBox adalah turunan dari class Window, class ListBox mempunyai konstruktornya sendiri yang memiliki tiga parameter, konstruktor pada class ListBox dapat menggunakan tanda : (titik dua) untuk memanggil kosntruktor base class-nya (konstruktor pada class Window)

public ListBox(int top, int left, string theContents):base(top, left)

Karena konstruktor tidak dapat diturunkan maka class turunan harus memiliki konstruktor sendiri.

Polymorphism

Ada dua aspek yang paling penting pada inheritance yang pertama adalah code reuse, sebagai contoh ketika anda membuat class ListBox maka anda dapat menggunakan logic yang sudah dibuat pada class Window

Aspek kedua yang tidak kalah penting dari inheritance adalah polymorhism, poly berarti banyak dan morph berarti bentuk, jadi polymorphism dapat berarti dapat menggunakan banyak bentuk tanpa harus mengacu details yang sama.

Anda dapat mengimplementasikan polymorphism dengan dua cara yaitu:

  • Membuat virtual method pada base class (class induk)
  • Membuat class turunan yang mempunyai method dengan keyword override yang mengganti isi dari method dengan keyword virtual yang ada pada base class-nya.

Penggunaan prinsip polymorphism dapat dilihat pada contoh program dibawah ini

   1: public class Window
   2:     {
   3:         //deklarasi konstruktor dengan dua parameter
   4:         public Window(int top, int left)
   5:         {
   6:             this.top = top;
   7:             this.left = left;
   8:         }
   9:
  10:         //method untuk draw window
  11:         public virtual void DrawWindow()
  12:         {
  13:             Console.WriteLine("Window: drawing Window at {0}, {1}",
  14:             top, left);
  15:         }
  16:
  17:         //member variabel dideklarasikan protected
  18:         //berarti dapat diakses dari class turunannya
  19:         protected int top;
  20:         protected int left;
  21:
  22:     }  // end Window
  23:
  24:     // class ListBox diturunkan dari class Window
  25:     public class ListBox : Window
  26:     {
  27:         //konstruktor yang menmanggil konstruktor dari base class nya
  28:         public ListBox(int top,int left,string contents): base(top, left)
  29:         {
  30:             listBoxContents = contents;
  31:         }
  32:
  33:         //method yang di override dari base class-nya
  34:         //karena mempunyai implementasi yang berbeda
  35:         public override void DrawWindow()
  36:         {
  37:             base.DrawWindow(); // invoke the base method
  38:             Console.WriteLine("Writing string to the listbox: {0}",
  39:             listBoxContents);
  40:         }
  41:
  42:         private string listBoxContents; // member variabel baru
  43:     }  // end ListBox
  44:
  45:     public class Button : Window
  46:     {
  47:         public Button(
  48:         int top,
  49:         int left)
  50:             : base(top, left)
  51:         { }
  52:
  53:         // an overridden version (note keyword) because in the
  54:         // derived method we change the behavior
  55:         public override void DrawWindow()
  56:         {
  57:             Console.WriteLine("Drawing a button at {0}, {1}\n",
  58:             top, left);
  59:         }
  60:     }  // end Button
  61:
  62:     public class Tester
  63:     {
  64:         static void Main()
  65:         {
  66:             Window win = new Window(1, 2);
  67:             ListBox lb = new ListBox(3, 4, "Stand alone list box");
  68:             Button b = new Button(5, 6);
  69:             win.DrawWindow();
  70:             lb.DrawWindow();
  71:             b.DrawWindow();
  72:
  73:             Window[] winArray = new Window[3];
  74:             winArray[0] = new Window(1, 2);
  75:             winArray[1] = new ListBox(3, 4, "List box in array");
  76:             winArray[2] = new Button(5, 6);
  77:
  78:             for (int i = 0; i < 3; i++)
  79:             {
  80:                 winArray[i].DrawWindow();
  81:             }   // end for
  82:         }   // end Main
  83:     }      // end Tester

Jika dijalankan akan diperoleh output sebagai berikut:

   1: Window: drawing Window at 1, 2
   2: Window: drawing Window at 3, 4
   3: Writing string to the listbox: Stand alone list box
   4: Drawing a button at 5, 6
   5:
   6: Window: drawing Window at 1, 2
   7: Window: drawing Window at 3, 4
   8: Writing string to the listbox: List box in array
   9: Drawing a button at 5, 6

Dapat dilihat dari contoh diatas bahwa base class yaitu Window mempunyai method yang bernama DrawWindow() yang mempunyai keyword virtual, ini berarti method tersebut dapat di override atau diganti implementasinya dengan method yang nama dan parameternya sama persis di kelas turunannya yaitu class ListBox.

bersambung ke Object Oriented Programming in C# (Part 4)

pustaka: “Learning C# 2005”, Jesse Liberty, Brian MacDonald, O’Reilly 2006

Object Oriented Programming in C# (Part2)

Pada Turtorial kedua ini akan dibahas beberapa topik yaitu:

  • Destroy Object
  • Overloading Method
  • Enkapsulasi Data dengan Property
  • Passing Value Type By Reference

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: {
   3:   // perintah disini
   4: }

Sintaks diatas akan diterjemahkan oleh compiler sebagai berikut

   1: protected override void Finalize()
   2:     {
   3:        try
   4:        {
   5:            // do work here
   6:        }
   7:        finally
   8:        {
   9:             base.Finalize();
  10:        }
  11:     }

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: using System;
   2:     class Testing : Idisposable //menggunakan interface IDisposable
   3:     {
   4:        bool is_disposed = false;
   5:        protected virtual void Dispose( bool disposing )
   6:        {
   7:           if ( !is_disposed ) // hanya mendispose objek sekali!
   8:           {
   9:              if ( disposing )
  10:              {
  11:                 Console.WriteLine( "Not in destructor,
  12:                 OK to reference other objects" );
  13:              }
  14:              Console.WriteLine( "Disposing..." );
  15:           }
  16:           this.is_disposed = true;
  17:        }
  18:
  19:        public void Dispose( )
  20:        {
  21:           Dispose( true );
  22:           // memanggil Garbage Collector
  23:           GC.SuppressFinalize( this );
  24:        }
  25:
  26:        ~Testing( )
  27:        {
  28:           Dispose( false );
  29:           Console.WriteLine( "In destructor." );
  30:        }
  31:     }

Overloading 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:
  18:         // constructors
  19:         public Time(System.DateTime dt)
  20:         {
  21:             Year = dt.Year;
  22:             Month = dt.Month;
  23:             Date = dt.Day;
  24:             Hour = dt.Hour;
  25:             Minute = dt.Minute;
  26:             Second = dt.Second;
  27:         }
  28:
  29:         public Time(string strTime) // overloading konstruktor
  30:         {
  31:             Console.WriteLine(strTime);
  32:         }
  33:
  34:         public Time(int Year, int Month, int Date,
  35:         int Hour, int Minute, int Second) // overloading konstruktor
  36:         {
  37:             this.Year = Year;
  38:             this.Month = Month;
  39:             this.Date = Date;
  40:             this.Hour = Hour;
  41:             this.Minute = Minute;
  42:             this.Second = Second;
  43:         }
  44:     }
  45:
  46:     class Tester
  47:     {
  48:         public void Run()
  49:         {
  50:             System.DateTime currentTime = System.DateTime.Now;
  51:             Time time1 = new Time(currentTime);
  52:             time1.DisplayCurrentTime();
  53:             Time time2 = new Time(2000, 11, 18, 11, 03, 30);
  54:             time2.DisplayCurrentTime();
  55:         }
  56:
  57:         static void Main()
  58:         {
  59:             Tester t = new Tester();
  60:             t.Run();
  61:         }
  62:     }

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

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 ?.

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: public class Time
   2:    {
   3:
   4:       // private member variables
   5:       private int year;
   6:       private int month;
   7:       private int date;
   8:       private int hour;
   9:       private int minute;
  10:       private int second;
  11:
  12:       // membuat property
  13:       public int Hour
  14:       {
  15:          get // mengambil nilai variable Hour
  16:          {
  17:             return hour;
  18:          }
  19:
  20:          set // memberi nilai variable Hour
  21:          {
  22:             hour = value;
  23:          }
  24:       }
  25:
  26:       // public  methods
  27:       public void DisplayCurrentTime( )
  28:       {
  29:          System.Console.WriteLine(
  30:          "Time: {0}/{1}/{2} {3}:{4}:{5}",
  31:          month, date, year, hour, minute, second );
  32:       }
  33:
  34:
  35:       // constructors
  36:       public Time( System.DateTime dt )
  37:       {
  38:          year = dt.Year;
  39:          month = dt.Month;
  40:          date = dt.Day;
  41:          hour = dt.Hour;
  42:          minute = dt.Minute;
  43:          second = dt.Second;
  44:       }
  45:
  46:
  47:    }
  48:     class Tester
  49:     {
  50:         public void Run()
  51:         {
  52:             System.DateTime currentTime = System.DateTime.Now;
  53:             Time t = new Time(currentTime);
  54:             t.DisplayCurrentTime();
  55:
  56:             // mengambil nilai variable Hour, get dijalankan
  57:             int theHour = t.Hour;
  58:
  59:             // menampilkan isi variable Hour
  60:             System.Console.WriteLine("Retrieved the hour: {0}",
  61:             theHour);
  62:
  63:             // increment
  64:             theHour++;
  65:
  66:             // memberi nilai variabel Hour dengan nilai baru
  67:             // set dijalankan
  68:             t.Hour = theHour;
  69:
  70:             // menampilkan isi variabel Hour setelah di-increament
  71:             System.Console.WriteLine("Updated the hour: {0}", t.Hour);
  72:         }
  73:
  74:
  75:         static void Main()
  76:         {
  77:             Tester t = new Tester();
  78:             t.Run();
  79:         }
  80:     }

Passing Value Type By Reference

Secara default di C# pengiriman nilai ke method menggunakan pass by value atau hanya mengirimkan nilai saja ke method seperti contoh dibawah ini

   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:
  12:         // public accessor methods
  13:         public void DisplayCurrentTime()
  14:         {
  15:             System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}",
  16:             Month, Date, Year, Hour, Minute, Second);
  17:         }
  18:
  19:         public void GetTime(int theHour, int theMinute, int theSecond)
  20:         {
  21:             theHour = Hour;
  22:             theMinute = Minute;
  23:             theSecond = Second;
  24:         }
  25:
  26:         // constructor
  27:         public Time(System.DateTime dt)
  28:         {
  29:
  30:             Year = dt.Year;
  31:             Month = dt.Month;
  32:             Date = dt.Day;
  33:             Hour = dt.Hour;
  34:             Minute = dt.Minute;
  35:             Second = dt.Second;
  36:         }
  37:
  38:
  39:     }
  40:
  41:     class Tester
  42:     {
  43:         public void Run()
  44:         {
  45:             System.DateTime currentTime = System.DateTime.Now;
  46:             Time t = new Time(currentTime);
  47:             t.DisplayCurrentTime();
  48:
  49:             int theHour = 0;
  50:             int theMinute = 0;
  51:             int theSecond = 0;
  52:             t.GetTime(theHour, theMinute, theSecond);
  53:             System.Console.WriteLine("Current time: {0}:{1}:{2}",
  54:             theHour, theMinute, theSecond);
  55:
  56:         }
  57:
  58:         static void Main()
  59:         {
  60:             Tester t = new Tester();
  61:             t.Run();
  62:         }
  63:     }

Jika kode diatas dijalankan hasilnya adalah

   1: 7/1/2008 12:22:19
   2: Current time: 0:0:0

Anda dapat melihat bahwa method t.GetTime(theHour, theMinute, theSecond); mencetak output 0:0:0 ini menandakan bahwa nilai yang dikirimkan ke method tersebut tidak dikembalikan ke variabel pemanggil methodnya (theHour, theMinute, theSecond). Jika anda ingin mengembalikan nilai ke variabel pemanggilnya maka anda harus menggunakan keyword ref. Penggunaan pass by ref pada method dapat dilihat pada contoh dibawah ini

   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:
  12:         // public accessor methods
  13:         public void DisplayCurrentTime()
  14:         {
  15:             System.Console.WriteLine("{0}/{1}/{2} {3}:{4}:{5}",
  16:             Month, Date, Year, Hour, Minute, Second);
  17:         }
  18:
  19:         // menggunakan references pada parameter
  20:         public void GetTime(
  21:            ref int theHour,
  22:            ref int theMinute,
  23:            ref int theSecond)
  24:         {
  25:             theHour = Hour;
  26:             theMinute = Minute;
  27:             theSecond = Second;
  28:         }
  29:         // constructor
  30:         public Time(System.DateTime dt)
  31:         {
  32:
  33:             Year = dt.Year;
  34:             Month = dt.Month;
  35:             Date = dt.Day;
  36:             Hour = dt.Hour;
  37:             Minute = dt.Minute;
  38:             Second = dt.Second;
  39:         }
  40:
  41:
  42:     }
  43:
  44:     class Tester
  45:     {
  46:         public void Run()
  47:         {
  48:             System.DateTime currentTime = System.DateTime.Now;
  49:             Time t = new Time(currentTime);
  50:             t.DisplayCurrentTime();
  51:
  52:             int theHour = 0;
  53:             int theMinute = 0;
  54:             int theSecond = 0;
  55:
  56:             // pass integer by reference
  57:             t.GetTime(ref theHour, ref theMinute, ref theSecond);
  58:
  59:             System.Console.WriteLine("Current time: {0}:{1}:{2}",
  60:             theHour, theMinute, theSecond);
  61:
  62:         }
  63:
  64:         static void Main()
  65:         {
  66:             Tester t = new Tester();
  67:             t.Run();
  68:         }
  69:     }

Jika program diatas dijalankan maka hasilnya

   1: 7/1/2008 12:25:41
   2: Current time: 12:25:41

bersambung ke Object Oriented Programming in C# (Part3)

pustaka: “Learning C# 2005”, Jesse Liberty, Brian MacDonald, O’Reilly 2006

Object Oriented Programming in C# (Part1)

Pengantar Object Oriented

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 pula 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.

Pada level pertama untuk mendesain anda harus berpikir interaksi antar objek-objek tersebut, dilihat dari status, kapabilitas, dan tanggung jawabnya.

  • Status : programmer harus mengacu pada kondisi status objek tersebut. Sebagai contoh anda mempunyai objek untuk merepresentasikan customer maka status dari customernya adalah customer address, phone number, email, sejarah pembelian customer, dsb.
  • Kapabilitas / Hak : customer dapat memiliki kapabilitas tapi programmer harus memilih yang berhubungan dengan problem domainnya diantaranya untuk membuat rekening, menarik tabungan, menyimpan tabungan, transfer dsb.
  • Tanggung Jawab: bersama dengan kapabilitas /hak ada pula tanggung jawab. Customer mempunyai tanggung jawab untuk mengisi informasi alamat tempat tinggalnya.

Class vs Object

Apa sich bedanya?. 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.

image

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
   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();
  24:         }
  25:     }

 

Access Modifiers

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

image

Continue reading