Download 7-Pewarisan Jamak

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Pewarisan Jamak
Oleh : Agus Priyanto, M.Kom
Tujuan Perkuliahan
Setelah mempelajari materi ini, diharapkan
mahasiswa mampu:
Mengerti tentang pewarisan jamak dan
Interface serta implementasinya dalam
bahasa C++ dan Java
Outline Kuliah
 Pewarisan atau Inheritance
 Implementasi dan problem
pewarisan jamak dalam C++
 Implementasi dalam Java
Pendahuluan
 Pewarisan awalnya dipandang sebagai
mekanisme untuk sharing kode (fungsi) dan
data (atribut)
 Pewarisan Jamak (multiple inheritance)
dipandang sebagai mekanisme untuk
membentuk suatu sub kelas dari beberapa
implementasi super kelas
Implementasi dalam C++
Sintaks :
class Turunan : public Dasar1, Public Dasar2{
// deklarasi badan kelas
}
Implementasi dalam C++
#include<iostream>
class base1
{
protected:
int iVar1; // To make it available
// to the derived class
public:
void show_1()
{
cout << iVar1 << endl;
}
};
#include<iostream>
class base2
{
protected:
int iVar2; // To make it available
// to the derived class
public:
void show_2()
{
cout << iVar2 << endl;
}
};
class derived : public base1,public base2
{
public:
void set(int iTx, int iTy)
{
iVar1=iTx;iVar2=iTy;
}
};
int main()
{
derived Dvar;Dvar.set(10,20);
Dvar.show_1();Dvar.show_2();
return 0;
}
Implementasi dalam C++
Problem  Ambiguitas :
1. Timbul ketika 2 kelas induk memiliki suatu fungsi
dengan nama yang sama
2. Kelas turunan memiliki beberapa salinan kelas dasar
yang sama
Implementasi dalam C++ (Ambiguitas)

Problem 1 : Dua kelas induk memiliki suatu fungsi
dengan nama yang sama.
#include<iostream>
class base1
{
protected:
int iVar1; // To make it available
// to the derived class
public:
void show()
{
cout << iVar1 << endl;
}
};
#include<iostream>
class base2
{
protected:
int iVar2; // To make it available
// to the derived class
public:
void show()
{
cout << iVar2 << endl;
}
};
class derived : public base1,public base2
{
// empty class
};
int main()
{
derived Dvar;
Dvar.show();
return 0;
}
Dari Base1 atau Base2 ??
Implementasi dalam C++
 Menggunakan scope resolution
operator (::)
Solusi
 Melakukan overriding method di
kelas anak
Implementasi dalam C++
Solusi (file ambiguitas_1.cpp)
• Menggunakan scope resolution operator (::)
class derived : public base1,public base2
{
// empty class
};
int main()
{
derived Dvar;
Dvar.base1::show();
Dvar.base2::show();
return 0;
}
Implementasi dalam C++
Solusi (file ambiguitas_2.cpp)
 Melakukan overriding method di kelas anak
class derived : public base1,public base2
{
public:
void disp() {
base1::show();
base2::show();
}
};
int main() {
derived Dvar;
Dvar::disp();
return 0;
}
Implementasi dalam C++ (Ambiguitas)

Problem 2 : Kelas turunan memiliki beberapa
salinan kelas dasar yang sama.
Class A
Class B
Class C
Class D
Implementasi dalam C++ (Ambiguitas)
 Problem 2 : Kelas turunan memiliki beberapa
salinan kelas dasar yang sama.
#include<iostream>
class A
{
protected:
int AVar;
};
class B : public A
{
protected:
int BVar;
};
class C : public A
{
protected:
int CVar;
};
class D : public B, public C
{
protected:
int DVar;
};
int main() {
D Dtemp;
Dtemp.Avar=10;
return 0;
}
ambiguitas
D mendapatkan
Avar dari B dan C
Implementasi dalam C++ (Ambiguitas)

Menggunakan scope resolution
operator (::)
Solusi

Menggunakan virtual base class
Implementasi dalam C++ (Ambiguitas)

SOLUSI Menggunakan scope resolution operator (::) (file
ambiguitas_3.cpp)
#include<iostream>
class A
{
protected:
int AVar;
};
class B : public A
{
protected:
int BVar;
};
class C : public A
{
protected:
int CVar;
};
int main() {
D Dtemp;
Dtemp.display();
return 0;
}
class D : public B, public C
{
protected:
int DVar;
};
public:
void display() {
B::AVar=20; C::AVar=30
cout << B::Avar << C::AVar;
}
}
Implementasi dalam C++
(Ambiguitas)

SOLUSI Menggunakan virtual base class (file
ambiguitas_4.cpp)
#include<iostream>
class A
{
protected:
int AVar;
};
}
class B : virtual public A
{
protected:
int BVar;
};
}
class C : virtual public A
int main() {
{
D Dtemp;
protected:
Dtemp.display();
int CVar;
return 0;
};
}
}
class D : public B, public C
{
protected:
int DVar;
};
public :
void display() {
Avar = 10;
cout << Avar << endl
}
}
Implementasi dalam Java

Java TIDAK mendukung pewarisan Jamak

Java HANYA memiliki pewarisan tunggal  Suatu
kelas turunan hanya memiliki satu kelas induk

Lalu Bagaimana perwujudannya dalam Java ?

Java mewujudkannya dengan menggunakan Interface
 Multiple interface inheritance BUKAN multiple
implementation inheritance
Interface
Interface kumpulan
deklarasi fungsi (tanpa
implementasi). Interface
juga dapat
mendeklarasikan
konstanta.
interfaceDeclaration {
interfaceBody
}
Interface
 Interface mendefinisikan suatu protokol
perilaku
 Suatu kelas mengimplementasi suatu interface
 Kelas tersebut akan melekat pada perilaku
yang didefinisikan interface
Interface
Implementasi :
Kelas implements interface {
// isi kelas
}
Pewarisan Jamak dalam Java
 Menggunakan Interface
 Kombinasi antara turunan satu kelas dengan
interface atau menggunakan interface sebagai
kelas-kelas Induk.
Bagaimana mewujudkan dalam Java ?
Parent
Other
ParentChild
Kombinasi antara turunan satu kelas dengan
interface
Parent
Parent Child
<<Interfac e> >
OtherInterface
Other
OtherChild
Implementasi dalam Java
class Parent
{
private int val;
public Parent(int value ) {
this.val = value;
}
public int getValue() {
return this.val;
}
// some code omitted
}
class Other
{
private int val;
public Other(int value) {
this.val = val;
}
public void whatever()
{
System.out.println("whatever methods \n");
}
}
interface OtherInterface
{
void whatever();
}
class OtherChild extends Other implements OtherInterface
{
public OtherChild (int value){
super(value);
}
// others ..
}
class ParentChild extends Parent implements OtherInterface
{
public ParentChild(int val) {
super(val);
child = new OtherChild(val);
}
public void whatever() {
child.whatever();
}
private OtherInterface child;
}