Bagi yang belum tau sebenarnya kalau base dan this itu adalah mengacu pada object yang sama.
So, postingan kali ini ingin menunjukkan hal tersebut.
OK, perhatikan kode dibawah ini :
internal class Base
{
internal static Object This;
//Alamat Base kita simpan didalam Base.This
public Base() { This = this; }
}
internal class Derived : Base
{
internal static Object BaseAddress;
internal Derived()
{
//Alamat Derived kita simpan didalam Derived.This
This = this;
BaseAddress = Base.This;
}
}
internal static class Program
{
private static void Main()
{
Derived d = new Derived();
//Cek apakah isi variable d dan Derived.ThisAddress sama
Console.WriteLine("Are d and Derived.ThisAddress same ? :" + (d == Derived.This));
//Cek apakah base dan this sama
Console.WriteLine("Are base and this same ? :" + (Derived.BaseAddress == Derived.This));
Console.ReadLine();
}
}Pada kode diatas, kita menyimpan alamat dari base pada Base.This lalu kita simpan kembali ke Derived.BaseAddress.
Lalu alamat dari Derived (this) kita simpan pada Derived.This.
Dan untuk membuktikan bahwa base dan this adalah mengacu pada object yang sama, kita mempergunakan static class Program.
Dan apabila Program di jalankan akan menampilkan bahwa base dan this mengacu pada object yang sama.
Jadi dari sini dapat kita analisa bahwa pada saat object Derived diinisialisasi,
maka struktur data dari Base dibuat dahulu oleh CLR, kemudian CLR membahkan struktur data Derived kedalam struktur data
dari Base, itulah sebabnya ketika kita menginisialisasi Derived kita juga harus menginisialisasi Base dengan cara memanggil constructor
dari Base(Walaupun pada kode diatas kita tidak melakukannya karena telah dilakukan secara implisit oleh CLR) . So, intinya ketika kita
meng-create object Derived sebenarnya itu hanyalah terdiri dari satu object yaitu Derived saja dan bukan Base dan Derived.
Jadi, kalau misalnya ada kode seperti ini pada Base :
internal class Base
{
internal event EventHandler SameNumbers;
private Random rnd = new Random();
private Object key = new Object();
private Int32? cache = null;
internal void SetScrambler(Int32 left, Int32 top)
{
lock (key)
{
Thread.Sleep(50);
Int32? temp = rnd.Next(0, 100);
Console.SetCursorPosition(left, top);
Console.Write(temp);
if (temp == cache) OnSameNumbers(EventArgs.Empty);
else cache = temp;
}
}
internal void ScramblerGo()
{
ThreadPool.QueueUserWorkItem(arg => { while (true) SetScrambler(0, 0); });
ThreadPool.QueueUserWorkItem(arg => { while (true) SetScrambler(4, 0); });
}
protected virtual void OnSameNumbers(EventArgs e)
{
EventHandler temp = SameNumbers;
if (temp != null) temp(this, e);
}
}Lalu kita buat Derived dengan kode seperti ini :
internal class Derived : Base
{
protected override sealed void OnSameNumbers(EventArgs e)
{
MessageBox.Show("OnSameNumbers : Numbers are same...");
base.OnSameNumbers(e);
}
}Sebenarnya pada kode base.OnSameNumbers(e) diatas, Derived mengacu pada struktur datanya sendiri.
Karena memang object base itu dan object this adalah object yang sama.
Jadi sekali lagi, intinya CLR hanya membuat satu struktur data (object) yaitu object Derived saja
yang classnya bisa dijelaskan dengan pseudocode berikut :
internal class Derived
{
internal event EventHandler SameNumbers;
//dengan catatan : fields private berikut ini ada(exist) distruktur data dari Derived
//tetapi tidak bisa diakses dari Derived karena diprivatekan oleh Base
private Random rnd = new Random();
private Object key = new Object();
private Int32? cache = null;
internal void SetScrambler(Int32 left, Int32 top)
{
lock (key)
{
Thread.Sleep(50);
Int32? temp = rnd.Next(0, 100);
Console.SetCursorPosition(left, top);
Console.Write(temp);
if (temp == cache) OnSameNumbers(EventArgs.Empty);
else cache = temp;
}
}
internal void ScramblerGo()
{
ThreadPool.QueueUserWorkItem(arg => { while (true) SetScrambler(0, 0); });
ThreadPool.QueueUserWorkItem(arg => { while (true) SetScrambler(4, 0); });
}
private void OnSameNumbers(EventArgs e)
{
MessageBox.Show("OnSameNumbers : Numbers are same...");
EventHandler temp = SameNumbers;
if (temp != null) temp(this, e);
}
}Itu sebabnya bila kita jalankan dengan static class Program berikut :
internal static class Program
{
private static void Main()
{
Derived d = new Derived();
d.SameNumbers += (sender, e) => MessageBox.Show("In Lambda : Numbers are same...");
d.ScramblerGo();
Console.ReadLine();
}
}Maka, "OnSameNumbers : Numbers are same..." akan tampil lebih dulu dari pada "In Lambda : Numbers are same...".
Karena memang pada kenyataannya pada class Derived "OnSameNumbers : Numbers are same..." ditampilkan terlebih
dahulu baru kemudian Event diRaise.