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