download

Matakuliah
Tahun
Versi
: T0044/Pemrograman Berorientasi Obyek
: 2005
: 1.0
Pertemuan 11
Polymorphism
1
Learning Outcomes
Pada akhir pertemuan ini, diharapkan mahasiswa
akan mampu :
• Menghasilkan program C++ dengan
konsep Polymorphism
2
Outline Materi
•
•
•
•
•
•
Definisi polymorphism
Abstract Class
Proses Kompilasi
Early vs Late Binding
Overriding vs Overloading method
Trivial vs True Polymorphism
3
Definisi polymorphism
• Polymorphism  kemampuan dari object–object yang berbeda
dalam sebuah class hirarki untuk melakukan fungsi (behavior) unik
terhadap suatu respon message
• Poly (Many) + morph (Shape) = POLYMORPHISM: banyak bentuk
(many shapes).
Polymorphism  “Single Interface, Multiple Method”
• Polymorphism adalah kemampuan class menyembunyikan
implementasi yg berbeda dalam interface yg sama
• Polymorphism memungkinkan sebuah method yang mempunyai
nama yang sama, namun aksi (tugas) yang berbeda.
• Dengan polymorphism dimungkinkan suatu fungsi yang
implementasi detilnya belum ada (isi fungsi belum ditulis).
• Fungsi tersebut akan dibuat virtual dan class yg berisi fungsi virtual
akan menjadi abstract class / Abstract Data type.
4
Definisi polymorphism
• Polymorphism sangat berhubungan dg
konsep Inheritance
• Implementasi polymorphism dg 2 cara:
– Overloading function: penggunaan kembali
nama fungsi yang sama tapi dengan argumen
yang berbeda
– Overriding function: sebuah fungsi dalam
class turunan yang memiliki nama, return type
dan argumen function yang sama dengan
fungsi dalam class induk
5
Kasus pada Inheritance
Class Animal
Class Bird
Class Mamal
Chrip ( )
Fly( )
Class Horse
Whinny ( )
Gallop ( )
Class Pegasus
• Implementasi Fly pada Birth
tidak sama dg Fly pada
Pegasus
• Implementasi Gallop (Kuda
belari) pada Horse tidak sama
dg Gallop pada Pegasus
• Alternatif Solusinya dg merename method Gallop()
menjadi Move() pada class
Horse, dan meng-override
Move() pada object Pegasus
untuk melakukan method
Berjalan gaya burung.
• begitu juga override Move()
pada class horses agar bisa
berjalan gaya kuda.
Fly( )
Gallop ( )
6
Abstract Class
• Absract class biasanya adalah base class, dan tidak
bisa dibuat instance.
• Manfaat dari virtual functions adalah agar virtual
method table (VMT) yg menentukan type runtime object
bukan programmer dg statements switch-nya, karena
pada program yg besar, statements switch akan sulit
dimaintain.
• Virtual function di-support oleh VMT, yg menyebabkan
runtime overhead, baik dalam ukuran maupun
performance program.
• VMT bekerja pada saat runtime dg demikian
polymorphism berhubungan dg proses kompilasi
7
Program – Abstract Class
• Perhatikan urutan base class & derived class
pada kasus berikut ini:
OrgEntity
Company
Division
Departement
– OrgEntity merupakan abstact class yg berarti tujuan
utamanya hanya sebagai base class
– OrgEntity memiliki function number_employees yg
me-return jumlah employee pada tiap unit organisasi
– ada class pada hirarki memiliki virtual function
office_party yg me-return jumlah employee yang
dianggarkan untuk acara tahunan
8
Program – Abstract Class
#include <iostream.h>
#include <string.h>
class OrgEntity
{ char name[25];
int employee_count;
public:
OrgEntity(char *s, int ec);
int number_employees()
{ return employee_count; }
char *org_name()
{ return name; }
virtual int office_party() = 0;
};
class Company : public OrgEntity
{ public:
Company(char *s, int ec);
virtual int office_party();
};
class Division : public Company
{ public:
Division(char *s, int ec);
virtual int office_party();
};
class Department : public Division
{ public:
Department(char *s, int ec);
int office_party();
};
Pure Virtual
Method  Abstract
Class OrgEntity
9
Program – Abstract Class
Company :: Company(char *s, int ec)
{}
Virtual int Company :: office_party()
{}
Division :: Division (char *s, int ec)
{}
Virtual int Division :: office_party()
{}
Department :: Department (char *s, int ec)
{}
int Department :: office_party()
{}
void budget(OrgEntity& oe)
{
cout << "\n---- Budget Report ----\n";
cout << oe.org_name();
cout << " $" << oe.number_employees()
* oe.office_party();
cout << '\n';
}
void main()
{ Company company("Bilbo Software,
Inc.", 35);
Division div("Vertical Applications",
12);
Department dept("Medical Practice",
4);
budget(company);
budget(div);
budget(dept);
}
10
Proses Kompilasi Program C++
.cpp
.Obj
+
.h
Polymorphism pada
C++ diproses pada
saat eksekusi
(runtime)  late
binding /dinamic
binding
.exe
BINDING /
LINKING
11
Early vs Late Binding
Early Binding
 C Style
 Function didefinisikan
sebelum compiling
 Link body function +
function header /
prototype
Trivial Polymorphism
Late Binding/Dinamic
Binding
 C++ Style
 Definisi function dpt
dilakukan saat runtime
 Compiler membuat VMT utk
class yg mengandung
polymorphism
 Jika derived class memiliki
fungsi yg sama (Overriding)
dg base class, VmT akan
menunjuk ke base-class
function
True Polymorphism
12
Early vs Late Binding
• Trivial Polymorphism
 Function Overloading  nama fungsi sama
tapi tugasnya berbeda
 Dibedakan oleh 3 function signature
• True Polymorphism
 Functon Overriding  fungsi yg namanya
sama tapi tidak berada dalam kelas yg sama
 Diimplementasikan dg Virtual Method
o Pure Virtual Method
o Squasi Virtual Method
13
Overriding vs Overloading method
#include<iostream.h>
class cA
{public: double A(double x)
{ return x*x;}
double B(double x)
{ return A(x)/5;}
double B(double x, double y)
{ return x/y;}
};
class cB: public cA
{public: double A(double x)
{return x*x*x;}
};
void main()
{ cB oB;
cout << oB.B(10);
}
Output:
20
Method B is
Overloaded
Method A is
Overrided
14
Pure VS Squasi Virtual Method
•
•
•
•
Pure Virtual Method hanya
mendeklarasikan function prototipes
saja (no body function)  task of
function’s not defined yet.
Suatu class yang memiliki pure virtual
method  abstract class.
Instance (object) tidak dapat dibuat dari
suatu abstract class, karena masih ada
fungsi yang tidak memiliki function
body.
Ciri dari pure virtual method adalah
pada deklarasi ditulis fungsi() = 0.
class MyClass
{
virtual void foo() = 0;
};
•
Squasi Virtual Method memiliki
fungsi minimal yang harus
dikerjakan oleh suatu method /ada
body function.
class MyClass
{ virtual void foo() { ; }
};
Nol
Statement
15
Virtual Destructor
• Base class pointer ke object turunan
– Jika di-destroy dengan delete, behavior tdk
terspesifikasi
• Perbaikan sederhana
– Declare base-class destructor virtual dengan
demikian ketika delete digunakan, destructor
tertentu yang dijalankan
• Ketika object class turunan di-destroy
– Destructor class turnan di-execute pertama kali,
destructor class induk di-execute kemudian
• Constructors tidak dapat dibuat virtual
16
Program – Virtual Destructor
#include <iostream.h>
#include <string.h>
class OrgEntity
{ char *name;
public:
OrgEntity(char *s);
virtual ~OrgEntity();
void org_name();
};
OrgEntity::OrgEntity(char *s)
{ name = new char[strlen(s)+1];
strcpy(name, s);
}
OrgEntity::~OrgEntity()
{ cout << "\nOrgEntity destructor";
delete[] name;
}
void OrgEntity::org_name()
{
cout << name;
}
class Division : public OrgEntity
{ char *manager;
public:
Division(char *s, char *mgr);
~Division();
};
Division::Division(char *s, char *mgr) :
OrgEntity (s)
{ manager=new char[strlen(mgr)+1] ;
strcpy(manager, mgr);
}
Division::~Division()
{ cout << "\nDivision destructor";
delete[] manager;
}
17
Program – Virtual Destructor
void main()
{
OrgEntity *orgs[3];
orgs[0] = new OrgEntity("Bilbo Software, Inc.");
orgs[1] = new Division("Vert Apps", "Ron Herold");
orgs[2] = new Division("Horiz Apps", "Bob Young");
for (int i = 0; i < 3; i++)
{ delete orgs[i]; }
}
18
Latihan Program#1
#include <iostream.h>
#include <string.h>
class BillingItem
{protected:
char name[25];
int cost;
public:
virtual void display() = 0;
};
class Product:public virtual
BillingItem
{ int qty_sold;
public:
Product(char *nm, int qty, int cst);
void display()
{ cout << qty_sold; }
};
Product::Product(char *nm, int qty,
int cst)
{ qty_sold = qty;
strcpy(name, nm);
cost = cst;
}
class Service : public virtual
BillingItem
{ int manhours;
public:
Service(char *nm, int mh, int
cst);
void display()
{ cout << manhours; }
};
19
Latihan Program #1 (Lanj)
Service::Service(char *nm, int mh,
int cst)
{ manhours = mh;
strcpy(name, nm);
cost = cst;
}
class Installation : public Product,
public Service
{public:
Installation(char *nm, int qty, int
hrs, int cst)
: Product(nm, qty, cst),
Service(nm, hrs, cst) { }
void display();
};
void Installation::display()
{
cout << "\nInstalled ";
Product::display();
cout << ' ' << name << 's';
cout << "\nLabor: ";
Service::display();
cout << " hours";
cout << "\nCost: $" << cost;
}
void main()
{ Installation inst("refrigerator", 2,
3, 75);
inst.display();
}
20
Latihan Program #2
• Buatlah function definition untuk overloading
function pada modul main( ) berikut ini
#include <iostream.h>
void main()
{ cetak(10); // mencetak angka 10
cetak (‘A’); // mencetak huruf A
cetak (‘X’,10); // mencetak huruf X sebayak 10 kali
cetak (7,’Z’); // mencetak angka 7 dan huruf Z
}
21
Tugas 11
• Tugas 11A: Mahasiswa membuat
ringkasan tentang konsep Polymorphism
• Tugas 11B: Mahasiswa mencari output
dari program Polymorphism
• Tugas 11C: Mahasiswa membuat program
sederhana yang menggambarkan konsep
Polymorphism
22