It's the matter of time

Neo's blog
See also: Other Geeks@INDC

Basic OOP - Confusion Keywords

Seminggu sudah saya tidak membuat postingan terbaru, dikarenakan deadline pekerjaan kantor yang begitu banyaknya
Di dalam posting kali ini, saya ingin berbagi masalah pengertian beberapa keyword yang sering dipusingkan oleh programmer dalam OOP
Berikut adalah beberapa keyword yang sering menimbulkan pertanyaan

Class vs Struct
Class dan Struct pada dasarnya memiliki kegunaan yang hampir sama, jadi jika programmer belum mengerti basic ini maka di dalam coding dimungkinkan programmer masih akan meraba-raba keyword mana yang ingin digunakan
Kebanyakan programmer tidak mau ambil pusing dan mengambil keyword Class, walaupun mungkin sebenarnya akan lebih optimal jika Struct yang digunakan
Perbedaan utama antara kedua keyword ini adalah Class merupakan type reference sedangkan Struct merupakan type Value
Jika teman-teman sudah mengetahui perbedaan kedua type ini, maka penjelasan untuk Class dan Struct dapat dilewati
Berikut ini adalah contoh perbedaan keduanya

public class MyClass
{
   public int _value;

   public MyClass(int value)
   {
      this._value = value;
   }

   public override string ToString()
   {
      return this._value.ToString();
   }
}

public struct MyStruct
{
   public int _value;

   public MyStruct(int value)
   {
      this._value = value;
   }

   public override string ToString()
   {
      return this._value.ToString();
   }
}

MyClass c1 = new MyClass(0);
MyClass c2 = c1;
c1._value += 1;
c2._value += 2;
Console.WriteLine("c1 = " + c1.ToString() + " c2 = " + c2.ToString());
//Hasilnya : c1 = 3 c2 = 3

MyStruct s1 = new MyStruct(0);
MyStruct s2 = s1;
s1._value += 1;
s2._value += 2;
Console.WriteLine("s1 = " + s1.ToString() + " s2 = " + s2.ToString());
//Hasilnya : s1 = 1 s2 = 2

Dari contoh di atas dapat dilihat secara nyata perbedaan antara kedua keyword tersebut
Beberapa hal lain yang perlu diketahui adalah keyword Struct tidak diperbolehkan untuk mendeklarasi sebuah instance constructor tanpa suatu value dan Struct juga tidak diperbolehkan untuk mendeklarasi sebuah destructor

Abstract Class vs Interface
Mungkin keyword ini adalah keyword yang sering sekali membingungkan, dan apa yang programmer ketahui adalah jika mereka dapat menggunakan Interface dengan baik, maka tidak perlu adanya sebuah Abstract Class
Sebenarnya penggunaan kedua keyword ini serupa tetapi tidak sama
Interface mengharuskan kita membuat sebuah kontrak terlebih dahulu sebelum menggunakan interface tersebut dan kita dapat mengimplementasi banyak Interface untuk sebuah class, mungkin hal inilah yang membuat programmer memiliki kecenderungan memilih Interface dibandingkan sebuah Abstract Class karena pada C# sebuah class hanya boleh menjadi turunan satu Abstract Class saja (Berbeda dengan C++ yang memungkinkan adanya multiple inheritance)
Sebenarnya Abstract Class memberikan kita sebuah cara untuk membuat class yang bersifat global penggunaannya sehingga class lain yang menjadi turunan dari Abstract Class dapat menggunakan field ataupun method di dalamnya, sebagai analogi bisa kita lihat sebuah class yang menjadi turunan dari class lain karena pada dasarnya keyword abstract ini harus diturunkan menjadi sebuah class real agar dapat digunakan (Dalam kasus VB.NET keyword abstract diberikan keterangan Must Inherit)
Berikut adalah sample dari keduanya serta contohnya

public abstract class MyAbstractClass
{
   public int _field;

   public abstract string AbstractMethod();
   public string NonAbstractMethod()
   {
      return "Non Abstract Method";
   }
}

public class MyImplementClass : MyAbstractClass
{
   public void ImplementationMethod()
   {
      MyImplementClass _implementation = new MyImplementClass();
      _implementation._field = 8;
      Console.WriteLine(_implementation._field);
      Console.WriteLine(_implementation.NonAbstractMethod());
      Console.WriteLine(_implementation.AbstractMethod());
   }

   public override string AbstractMethod()
   {
      return "Abstract Method";
   }
}

public interface MyInterface
{
   public string InterfaceMethod();
}

public class MyImplementInterface : MyInterface
{
   public string InterfaceMethod()
   {
      return "Interface Method";
   }
}

Abstract class bisa menyimpan abstrat method lainnya, yang terpenting adalah kita hanya perlu membuat turunan dari class tersebut untuk menggunakannya
Dalam kasus Interface, kita perlu mengimplementasikan Interface yang akan kita gunakan

Event vs Delegate
Kedua keyword yang satu ini sering sekali diambil pusing oleh programmer yang baru mengenal kegunaan Event dan Delegate
Sebenarnya keduanya memiliki cara kerja yang berbeda, namun berkaitan satu sama lain
Event merupakan sebuah pesan yang dikirim dari sebuah object sebagai akibat karena adanya action pada application
Misalnya action ketika tombol click mouse ditekan, action ketika tombol keyboard ditekan
Object yang membuat sebuah Event terjadi disebut Event sender dan Object yang merespond disebut Event receiver
Namun dalam kasus Event ini, sender dan receiver sama sekali tidak berkaitan dan mengenali satu sama lain
Untuk itulah diperlukan sebuah perantara pointer yang kita sebut sebagai Delegate
Berikut adalah contohnya

public class EventClass
{
   public delegate void MyEvent(string message);

   public event MyEvent Log;

   public void EventProcess()
   {
      OnLog("EventProcess() activate");
      OnLog("EventProcess() deactivate");
   }

   protected void OnLog(string message)
   {
      if (Log != null)
      {
         Log(message);
      }
   }
}

public class EventImplementation
{
   public static void Main(string[] args)
   {
      EventClass ec = new EventClass();
      ec.Log += new EventClass.MyEvent(ec_Log);
      ec.EventProcess();
      //Hasilnya : EventProcess() activate EventProcess() deactivate
      //Proses event sender dimulai ketika ec.Log diberikan nilai event baru dan dari hasil dapat dilihat
      //bahwa proses delegate telah berjalan dan memberikan event pointer ke method ec_Log sebagai event receiver
   }

   static void ec_Log(string message)
   {
      Console.WriteLine(message);
   }
}

Contoh di atas menunjukkan sebuah event yang dihubungkan melalui sebuah delegate ke method OnLog, dengan demikian Event yang menggunakan pola sesuai dengan pola delegate yang diberikan akan mendapatkan fungsi delegate juga

Antonio Fernandez
Share this post: | | | |

Comments

No Comments