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
class base1 { protected: int iVar1; // To make it available // to the derived class public: void show_1() { cout << iVar1 << endl; } };
#include 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 class base1 { protected: int iVar1; // To make it available // to the derived class public: void show() { cout << iVar1 << endl; } };
#include 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 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 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 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
< > 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; }