Showing posts with label N10. Referensi Bahasa C# (OOP). Show all posts
Showing posts with label N10. Referensi Bahasa C# (OOP). Show all posts

004. Event dan Delegate

Apakah Event dan Delegate?

Konsep Event dan Delegate bekerja sama dalam sebuah Class untuk mengatur dan menginformasikan suatu kejadian apabila member dan data dalam sebuah Class diproses atau berubah.

Delegate

Delegate dalam C# berguna untuk membuat referensi suatu method, atau sebagai function pointer. Untuk mendeklarasikannya, kita menambahkan keyword delegate pada nama delegate, seperti di bawah ini:




delegate void contohdelegate();


class CForm1 : FormUtama

{

delegate void ExecuteMethod(string s);

public void method1()

{

string s = "test";

}

public void method2(string s)

{
s = "bagus";
}

}

Pada method yang meninstansiasi delegate tersebut, kita gunakan beberapa cara berikut ini:

// cara. 1.

ExecuteMethod em = null;

string l;

em += new ExecuteMethod(method1);

em.Invoke();

baris terakhir bisa digantikan dengan baris dibawah ini


em();

Pada sintaks di atas, method invoke akan sama dengan em(). Cara berikutnya seperti sintaks di bawah ini. Tampak bahwa nama method langsung langsung dituliskan mengikuti deklarasi. Cara ini disebut menggunakan named method.

//cara. 2.

ExecuteMethod em = method1;
em();

Di samping cara instansiasi di atas bisa juga dengan anonimous method seperti di bawah ini. Penggunaan instansiasi ini untuk mengurangi overhead sebuah delegate… dengan menghindari penggunaan sebuah method yang tidak perlu.

ExecuteMethod em = delegate() { };
em();

Event

Event merupakan suatu cara atau mekanisme yang memungkinkan sebuah kejadian, yang ditimbulkan oleh perubahan data atau proses di sebuah method, bisa diketahui statusnya dan dipakai untuk keperluan selanjutnya, seperti berkomunikasi dengan objek lain.

Contoh-contoh event misalnya ialah kejadian saat mouse click, saat data belum berubah, saat data telah berubah, saat tombol ditekan, dan seterusnya.

Cara deklarasi event

Untuk menambahkan sebuah event di class, kita perlu menuliskan event keyword, dan menyediakan sebuah delegate dan sebuah nama event. Pada contoh ini, sebuah delegate didefinisikan dan dikaitkan dengan event bernama CobaEvent.

public delegate void SampleEventDelegate(object sender, EventArgs e);

public class SampleEventSource

{

public event SampleEventDelegate CobaEvent;

}

Urutannya ialah:

  1. deklarasi delegate
  2. deklarasi event.
  3. membuat method yang akan memicu event tersebut.

class ClassBentuk2

{

public delegate void ExecuteMethod();
public event ExecuteMethod testevent;

public void method1()
{
testevent();
}

}

Bagaimanan cara menggunakan Event?

Pada contoh kode di bawah ini, sebuah event akan digenerate saat user mengeksekusi method1. Disini isi eventnya ialah mengeksekusi method TestBiasa(). Pada pemanggilan event ini, digunakan anonymous method untuk untuk menangkap event yang terjadi.

ClassBentuk2 c4 = new ClassBentuk2();
//c4.method1();
c4.testevent += delegate { TestBiasa(); };
c4.method1();

003. C#: Interface Class

Interface merupakan Class umum yang memuat definisi umum, yang akan digunakan sebagai rujukan bagi Class yang mengimplementasikan Class ini. Pada interface, method dan property yang didefinisikan belum ditentukan. Class yang menggunakan sebuah interface berarti terikat kontrak untuk mengimplementasikan semua method, property, maupun indexer dari interface tersebut.




Interface mempunyai kegunaan yang hampir sama dengan abstract class yang akan disampaikan dalam bagian lain bab ini, dengan perbedaan:

  1. Interface merupakan kontrak yang harus diikuti semua property/methodnya oleh class yang mengimplementasikannya. Sedangkan abstract Class tidak.
  2. Interface hanya mendefinisikan kerangka method dan property yang akan dipakai. Isi prosesnya akan diimplementasikan di Class. Abstract Class bisa mengandung definisi method/property, dan bisa pula mengandung proses implementasinya.

interface Interface1

{
void method1();
void method2();
string property1
{
set;

get;

}

}

Untuk mengimplementasikan Interface ini sama dengan melakukan inheritance pada class biasa, dan kemudian template property dan methodnya dengan melakukan klik kanan pada interface tersebut, pada contoh ini Interface1 , dan pilih menu Implement Interface. Dari hasil template yang dihasilkan seperti kode di bawah, masukkan kode proses yang diinginkan.

class ClassIInterface : Interface1

{

// #region Interface1 Members

void Interface1.method1()

{

throw new Exception("The method or operation is not implemented.");

}

void Interface1.method2()

{
throw new Exception("The method or operation is not implemented.");
}

string Interface1.property1

{
get
{

throw new Exception("The method or operation is not implemented.");

}

set

{
throw new Exception("The method or operation is not implemented.");

}

}

// #endregion

}


002. Abstract Class

Abstract Class merupakan Class yang khusus dibuat untuk keperluan inheritance. Tujuan dari pembuatan abstract class ini ialah untuk membuat definisi umum bagi class-class yang akan menjadi turunan darinya.

Untuk membuatnya kita cukup menambahkan keyword abstract di depan class yang kita definisikan.

abstract class ClassBasis

{

}

Definisi umum ini bisa jadi sudah mempunyai method yang dibuat khusus untuk diturunkan.

abstract class ClassBasis

{

public void method1(ref string s)

{
s = "this is a sample of method";
}

}

Abstract class bisa juga mempunyai sebuah abstract method, yang baru dibuatkan method implementasinya di class turunan.

abstract class ClassBasis
{ public abstract void method2(ref string s);
}

Abstract Class tidak bisa diinstansiasi. Abstract method tidak mempunyai implementasi, sehingga penulisannya dilakukan hanya dengan mengikutkan semikolon, bukan blok method {} seperti biasanya. Abstract method ini bisa digunakan oleh Class turunannya dengan melakukan override.

class ChildBasis : ClassBasis

{

public override void method2(ref string s)
{

s = "this is a child implement method";

}

}

Pada class turunan dari abstract class, melalui IDE VS2005 kita bisa membuat implementasi methodnya dengan mengarahkan kursor pada nama class di belakang class turunan, dan memilih menu implements Abstract Class, sehingga abstract method di Class Induk akan ditulis secara otomatis template-nya di Class turunan.

template kode yang dihasilkan akan memudahkan penulisan implementasi yang kita inginkan, seperti di bawah ini:

class TBasis : ClassBasis

{

public override void method2(ref string s)

{

throw new Exception("The method or operation is not implemented.");

}

}


001. virtual untuk override

keyword virtual

Virtual merupakan keyword yang digunakan untuk membuat sebuah method, property, atau event dari sebuah class induk bisa di-override di class turunan dari class induk tersebut.



Ini berarti memberi keleluasaan apakah suatu class itu menggunakan method dengan proses yang sama atau sama sekali berbeda dari induknya, namun dengan nama method yang sama.

Misal: property dari class induk adalah seperti ini:


Public Virtual int jumlahroda()

{

return 2;

}

Di Class turunannya, kita bisa meng-override method di atas dengan keyword override seperti ini:

Public override int jumlahroda()

{

return 3;

}

Di Class turunan yang lain, apabila jumlah rodanya sama dengan Class induknya maka kita tidak perlu melakukan override.

Contoh kode lebih jelasnya seperti ini, seperti ini:

class ClassUtama
{

public virtual string bentuk()

{
return "default";
}

}

class ClassBentuk1 : ClassUtama
{

}

class ClassBentuk2 : ClassUtama
{
public override string bentuk()
{
return "oval";
}

}

Pada contoh ini kita mempunyai sebuah class induk bernama ClassUtama. Dan Class turunan bernama ClassBentuk1 dan ClassBentuk2.

ClassUtama c = new ClassUtama();
string hasil = c.bentuk();
Console.WriteLine("parent class: " + hasil);


ClassUtama c1 = new ClassBentuk1();
string hs = c1.bentuk();
Console.WriteLine("child class 1: " + hs);

ClassUtama c2 = new ClassBentuk2();
string h2 = c2.bentuk();
Console.WriteLine("child class 2: " + h2);

Hasil ekseksekusinya akan tampak seperti ini:

Parent class: default
Child class 1: default
Child class 2: oval

Turunan pertama akan method bentuknya akan mengambil method dari class induknya, karena dia tidak melakukan override.