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; }