POLYMORPHISM ~ SUMBER INFORMASI





Rabu, 23 September 2009

POLYMORPHISM


Polymorphism adalah kemampuan untuk mempunyai beberapa bentuk yang berbeda. Mempunyai banyak bentuk, merupakan dua kelas yang diturunkan dari satu kelas mempunyai metode sama tetapi implementasinya berbeda. Atau dengan kata lain nama metode sama kode berbeda. Metode ini sering disebut metode Virtual. Penggunaannya dengan menggunakan kata “Virtual
Untuk mempelajari materi polimorfisme kita harus paham dulu terhadap penggunaan pointer dan inheritance. Coba anda pahami instruksi berikut, jika anda masih belum paham pelajari kembali materi terkait:
int a::b(c) {}; // Materi Class
a->b // Materi pointer
class a: public b; // Materi Relationships between classes
- Pointers to base class
Salah satu keuntungan terbesar dalam menurunkan class adalah bahwa pointer ke class turunan merupakan tipe yang kompatibel dengan pointer ke class dasar. Bagian ini akan membahas kelebihan C++ dalam hal tersebut. Sebagai contoh kita akan menuliskan kembali program tentang persegi panjang dan segitiga dalam contoh sebelumnya dengan deklarasi pointer :
Contoh :
// pointers to base class
#include
class CPolygon {
protected:
int width, height;
public:
void set_values (int a, int b)
{ width=a; height=b; }
};
class CRectangle: public CPolygon {
public:
int area (void)
{ return (width * height); }
};
class CTriangle: public CPolygon {
public:
int area (void)
{ return (width * height / 2); }
};
int main ()
{
CRectangle rect;
CTriangle trgl;
CPolygon * ppoly1 = ▭
CPolygon * ppoly2 = &trgl;
ppoly1->set_values (4,5);
ppoly2->set_values (4,5);
cout << "Rectangle area = "<<<>
cout << "Triangle area = "<<<>
return 0;
}
OUTPUT



Fungsi main membuat dua pointer yang menunjuk ke objek dari class CPolygon, yakni *ppoly1 dan *ppoly2. Kedua pointer tersebut diinisialisasi dengan alamat objek rect dan trgl, dan karena pointer tersebut merupakan objek class turunan dari Cpolygon, maka inisialisasi ini benar.
Pointer *ppoly1 dan *ppoly2 dideklarasikan dari base class. Inisialisasi dengan rect dan trgl valid, namun pointer *ppoly1 dan *ppoly2 tetap tidak dapat mengakses member CRectangle dan CTriangle. Untuk alasan ini, ketika area() dipanggil kita tidak mungkin menggunakan pointer *ppoly1 dan *ppoly2.
Untuk membuat agar *ppoly1 dan *ppoly2 dapat memanggil area(), maka harus dideklarasikan pada base classnya dan tidak hanya di class turunannya. Cara mendeklarasikannya dapat kita lihat di pembahasan materi Virtual members.
- Virtual members
Untuk mendeklarasikan elemen sebuah kelas yang akan kita redefinisika di kelas turunan kita harus mendauluinya dengan keyword virtual maka pointer ke obyek yang menunjuk klas tersebut dapat digunakan dengan baik.
// virtual members
#include
class CSegibanyak {
protected:
int lebar, tinggi;
public:
void set_nilai (int a, int b)
{ lebar=a; tinggi=b; }
virtual int luas (void)
{ return (0); }
};
class CSegiempat: public CSegibanyak {
public:
int luas (void)
{ return (lebar * tinggi); }
};
class CSegitiga: public CSegibanyak {
public:
int luas (void)
{ return (lebar * tinggi / 2); }
};
int main () {
CSegiempat rect;
CSegitiga trgl;
CSegibanyak poly;
CSegibanyak * ppoly1 = &rect;
CSegibanyak * ppoly2 = &trgl;
CSegibanyak * ppoly3 = &poly;
ppoly1->set_nilai (4,5);
ppoly2->set_nilai (4,5);
ppoly3->set_nilai (4,5);
cout <<>luas() <<>
cout <<>luas() <<>
cout <<>luas() <<>
return 0;
}
OUTPUT.

Sekarang kita punya 3 kelas (CSegibanyak, CSegiempat dan CSegitiga) yang memiliki anggota yang sama: lebar, tinggi, set_nilai() dan luas(). luas() telah didefinisikan sebagai virtual karena itu akan didefinisikan kembali pada kelas turunan. Anda dapat melakukan verifikasi jika anda ingin melakukannya dengan menghilangkan keyword virtual dari kode program diatas dan kemudian anda eksekusi program tersebut, hasil akan menhadi 0 untuk ketiga segibanyak bukannya 20,10,0. ini disebabkan karena pemanggilan terhadap obyek (CSegiempat::luas(), CSegitiga::luas() dan CSegibanyak::luas(), akan mengacu ke CSegibanyak::luas() dan akan memanggil fungsi yang sama tersebut (CSegibanyak::luas() ) untuk semua pemanggilan melalui obyek kelas turunan karena pemanggilannya menggunakan pointer dengfan tipe CSegibanyak. Ini menunjukan kepada anda tentang kegunaan dari keyword virtual, yang mengijinkan member/anggota dari kelas turunan dengan nama yang sama dengan member dari kelas dasar (base class) untuk dipanggil dari pointer dengan tipe kelas dasar (bas e class) tetapi melaksanakan fungsi tersebut yang didefinisikan pada kelas turunan.



share

0 komentar:

Posting Komentar

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Grocery Coupons