Materi 6 – Inheritance Niko Ibrahim, MIT Maranatha Christian University
Like mother, like daughter... [common saying]
Today’s Menu INHERITANCE Inheritance
Specialization Extension Two kinds of relationship Example: aggregation Vs inheritance Protected scope Overriding methods Calling the superclass
INHERITING FOR EVENT HANDLING Event handling in aLibrary Event handling implementation Delegation Model
Inheritance Inheritance memungkinkan kita untuk mendefinisikan
sebuah kelas yang bersifat umum, yang kemudian kita bisa definisikan kelas-kelas lain yang lebih khusus dengan cara menambahkan beberapa definisi tambahan kepada kelas umum tadi. Hal ini sangat efektif dan membantu para programmer, karena kelas khusus (child) tadi akan memiliki properties/method/variabel yang sama dengan kelas umum (parent) Kelas Umum (parent) BASE CLASS Kelas Khusus (child) DERIVED CLASS
Contoh Kasus Kita akan mendesain program penyimpanan data
“Student”, “Lecturer”, dan “Staff” di sebuah fakultas. Ketiga entitas tersebut memiliki kesamaan dan dapat digolongkan menjadi satu kelas umum, yaitu “Person” Jadi, kita bisa katakan bahwa “Student” adalah subclass dari “People” “Student” pun bisa memiliki subclass lagi, yaitu “Undergraduate” dan “Graduate”
Hirarki Inheritance Person
Employee
Student
Undergraduate
Graduate
Master
Lecturer
PhD
Staff
Contoh Inheritance KELAS PERSON Kelas “Person” hanya memiliki property “name” Fungsinya sangat sederhana, yaitu memberikan nama seseorang Kelas “Person” disebut sebagai BASE CLASS KELAS STUDENT Kelas “Student” adalah subclass dari “Person” Kelas “Student” disebut sebagai DERIVED CLASS Derived Class adalah suatu kelas yang didefinisikan dengan cara menambahkan instance variable dan methods kepada kelas yang telah ada (Base Class)
Hirarki Kelas dalam UML Person
- name: String + setName (String newName): void + getName ( ): String + writeOutput ( ): void + sameName (Person otherPerson): boolean
Student - studentNumber: int + reset(String newName, int newStudentNumber): void + getStudentNumber( ): int + setStudentNumber (int newStudentNumber): void + writeOutput( ): void + equals(Students otherStudent): boolean
Kelas “Person” public class Person{ private String name; public Person(){ name = "No name yet."; }
// Constructor
public Person (String initialName){ name = initialName; } public void setName(String newName){ name = newName; } public String getName(){ return name; } public void writeOutput(){ System.out.println("Name: " + name); }
}
public boolean sameName(Person otherPerson){ return (this.name.equalsIgnoreCase(otherPerson.name)); }
Kelas “Student” public class Student extends Person menjadi base class { private int studentNumber;
// extends Person, artinya: kelas “Person”
public Student(){ // Constructor super(); // Super(): memanggil Constructor parent-nya, yaitu “Person” studentNumber = 0;} public Student(String initialName, int initialStudentNumber){ super(initialName); studentNumber = initialStudentNumber; } public void reset(String newName, int newStudentNumber){ setName(newName); studentNumber = newStudentNumber; } public int getStudentNumber(){ return studentNumber;
}
public void setStudentNumber(int newStudentNumber){ studentNumber = newStudentNumber;} public void writeOutput(){ System.out.println("Name: " + getName()); System.out.println("Student Number: " + studentNumber);
}
}
public boolean equals(Student otherStudent){ return (this.sameName(otherStudent) && (this.studentNumber == otherStudent.studentNumber)); }
DEMO “PERSON” – “STUDENT” public class InheritanceDemo{ public static void main (String[] args){ Student s = new Student(); s.setName("Warren Peace"); s.setStudentNumber(1234); s.writeOutput(); } } HASIL:
Name: Warren Peace Student Number: 1234
Sintaks Umum untuk Inheritance public class Derived_Class_Name extends Base_Class_name { Declaration_of_added_Instance_variable Delcaration_of_added_and_overriden_methods }
Contoh lain (Praktikum 1: Sun Rise)
Overidding kelas Shape
Overriding Method Definitions Pada kelas “Student”, kita menambahkan sebuah method dengan nama
“writeOutput” yang tidak memiliki parameter. Namun, kelas “Person” pun memiliki method dengan nama yang sama “writeOutput” dan tanpa parameter pula. Java memiliki aturan sbb: Apabila derived class memiliki method yang sama persis (nama, jumlah
parameter, & tipe parameter-nya) dengan base class, maka method derived class akan menimpa (override) method di base class.
Jadi pada saat program membaca kode: s.writeOutput( ); Maka, method writeOutput( ) yang dibaca adalah yang kepunyaan kelas Student
Two Kinds Of Relationship Hubungan antar kelas sebenarnya bisa digolongkan menjadi dua jenis: Is_a (perlu menggunakan keyword extends) Has_a (tidak perlu menggunakan keyword extends)
Contoh hubungan “Is_a”:
“Student” is a “Person”, artinya seorang Student “adalah” Person. Namun, seringkali kita memerlukan hubungan yang bukan “is a” Misalnya: kelas Student memiliki kelas Date yang berguna sebagai tanggal
enrollment. Jelas bahwa “Student” is not a “Date” Sehingga kita perlu menggunakan hubungan “has a”, jadi Student “has a” Date Caranya adalah dengan menambahkan sebuah instance variable bertipe Date di kelas Student. Tidak perlu menggunakan keyword extends. Contoh lain adalah:
Clock memiliki ClockFace ClockFace memiliki ClockHand
Two Kinds Of Relationship Aggregation (composition)
Class B uses Class A Class B has a Class A Class B is a client of Class A Class A is a supplier to Class B
Inheritance (extension) Class B extends Class A Class B is a subclass of Class A Class A is a superclass of Class B
Panduan: Is_a or Has_a? What kind of relationship?
How does a new class relate to another? Try asking “is a” or “has a "
"Has a" - use aggregation "Is a" - use inheritance
Is_a atau has_a? Aggregation: Has_a
Inheritance: Is_a
a dog has_a tail a car has_a wheel (or 4) a student has_an ID number a rectangle has_a color a client has_a supplier an aggregate has_a component
a dog is_an animal a car is_a vehicle a student is_a person a rectangle is_a geometric shape a subclass is_a superclass an extending class is_a base class