PBO-Polymorphism - 9

Polimorfisme dalam inheritance memungkinkan objek dari subclass digunakan di mana pun objek superclass diharapkan, dan memungkinkan metode yang sama untuk berperilaku berbeda tergantung pada kelas objek yang memanggilnya. Polimorfisme memberikan fleksibilitas pada kode sehingga metode yang sama bisa diimplementasikan secara berbeda di kelas yang berbeda, namun tetap bisa dipanggil melalui referensi superclass.

Penjelasan Polimorfisme

Dalam inheritance, polimorfisme memungkinkan satu metode yang sama di superclass di-override (ditimpa) di subclass untuk memberikan perilaku yang sesuai dengan subclass tersebut. Ini memungkinkan kode yang memanggil metode di superclass tetap bisa menggunakan metode dengan nama yang sama di subclass. Ini mengurangi kebutuhan untuk menulis kode tambahan untuk memeriksa tipe objek atau memanggil metode spesifik berdasarkan tipe.


Dengan polimorfisme:

  1. Kita dapat menambah jenis display baru dengan mudah tanpa harus mengubah kode yang memanggil display().
  2. Kode menjadi lebih modular dan mudah dibaca karena menggunakan metode yang sama (display()) namun sesuai konteks.
  3. Menghindari kondisi if-else untuk memeriksa tipe Post, sehingga kode lebih bersih dan ringkas.

Polimorfisme memudahkan penulisan kode yang fleksibel dan mudah di-maintain dalam sistem yang mengandung hierarki kelas yang beragam.

Overriding

Overriding adalah fitur dalam pemrograman berorientasi objek yang memungkinkan subclass untuk menyediakan implementasi spesifik dari suatu metode yang sudah didefinisikan di superclass.

Ciri-ciri utama Overriding:

  1. Nama, Parameter, dan Tipe Pengembalian yang Sama: Metode di subclass harus memiliki nama, parameter, dan tipe pengembalian yang sama dengan metode di superclass.
  2. Dukungan Polimorfisme: Overriding memungkinkan penggunaan polimorfisme, di mana objek dari subclass dapat diperlakukan sebagai objek dari superclass, tetapi tetap menjalankan versi metode yang di-override di subclass.
  3. Annotations: Dalam Java, keyword @Override biasanya ditambahkan sebelum metode yang di-override untuk memastikan bahwa metode tersebut memang merupakan overriding dari superclass. Ini membantu menghindari kesalahan penulisan atau penamaan yang mungkin tidak cocok dengan metode di superclass.

Manfaat Overriding:

  • Spesialisasi Metode untuk Subclass: Subclass dapat memiliki metode dengan perilaku khusus, yang mungkin tidak relevan bagi superclass.
  • Pemanfaatan Polimorfisme: Memungkinkan satu metode yang sama untuk berperilaku berbeda sesuai tipe objek yang memanggilnya.
  • Modular dan Extensible: Dengan overriding, kode menjadi modular karena kita tidak perlu memodifikasi kode superclass untuk mengubah perilaku dalam subclass.

Contoh Studi Kasus Overriding: Sistem Pengelolaan Kendaraan di Rental Mobil

Misalkan kita mengelola sistem rental mobil yang mendukung beberapa jenis kendaraan seperti mobil biasa, truk, dan kendaraan mewah. Setiap kendaraan memiliki cara yang berbeda dalam menghitung tarif sewa berdasarkan jenisnya. Kita bisa menggunakan overriding untuk menyediakan metode calculateRentalCost() yang spesifik untuk setiap jenis kendaraan.

1. Membuat Superclass Vehicle

java

class Vehicle {

    protected double baseRate;

     public Vehicle(double baseRate) {

        this.baseRate = baseRate;

    }

 

    public double calculateRentalCost(int days) {

        return baseRate * days;

    }

}

  • Vehicle memiliki metode calculateRentalCost() yang menghitung tarif berdasarkan tarif dasar (baseRate) dikalikan dengan jumlah hari (days).
  • Subclass nanti akan meng-override metode ini untuk menyesuaikan tarif sesuai jenis kendaraannya.

2. Menggunakan Overriding dalam Subclass Car, Truck, dan LuxuryCar

java

class Car extends Vehicle {

    public Car(double baseRate) {

        super(baseRate);

    }

     @Override

    public double calculateRentalCost(int days) {

        // Mobil biasa tanpa biaya tambahan

        return baseRate * days;

    }

}

 

class Truck extends Vehicle {

    public Truck(double baseRate) {

        super(baseRate);

    }

     @Override

    public double calculateRentalCost(int days) {

        // Truk memiliki biaya tambahan untuk penggunaan berat

        double heavyDutyFee = 50.0;

        return (baseRate * days) + heavyDutyFee;

    }

}

 

class LuxuryCar extends Vehicle {

    public LuxuryCar(double baseRate) {

        super(baseRate);

    }

     @Override

    public double calculateRentalCost(int days) {

        // Kendaraan mewah memiliki tarif tambahan untuk layanan premium

        double luxuryFee = 100.0;

        return (baseRate * days) + luxuryFee;

    }

}

  • Car: calculateRentalCost() menggunakan tarif dasar saja tanpa tambahan.
  • Truck: calculateRentalCost() menambahkan biaya heavyDutyFee karena truk memerlukan biaya tambahan untuk penggunaan berat.
  • LuxuryCar: calculateRentalCost() menambahkan luxuryFee untuk layanan premium.

3. Menggunakan Polimorfisme dengan Overriding

Karena Car, Truck, dan LuxuryCar adalah subclass dari Vehicle, kita bisa menggunakan polimorfisme untuk memanggil calculateRentalCost() pada objek dari tipe Vehicle namun hasilnya sesuai dengan tipe objek aslinya.

java

public class Main {

    public static void main(String[] args) {

        Vehicle myCar = new Car(200);

        Vehicle myTruck = new Truck(300);

        Vehicle myLuxuryCar = new LuxuryCar(500);

         int rentalDays = 3;

         System.out.println("Car rental cost for " + rentalDays + " days: " + myCar.calculateRentalCost(rentalDays));

        // Output: Car rental cost for 3 days: 600.0

         System.out.println("Truck rental cost for " + rentalDays + " days: " + myTruck.calculateRentalCost(rentalDays));

        // Output: Truck rental cost for 3 days: 950.0

         System.out.println("Luxury Car rental cost for " + rentalDays + " days: " + myLuxuryCar.calculateRentalCost(rentalDays));

        // Output: Luxury Car rental cost for 3 days: 1600.0

    }

}

Penjelasan:

Pada contoh ini:

  • myCar.calculateRentalCost(rentalDays) memanggil versi metode calculateRentalCost() di kelas Car, yang hanya mengalikan tarif dasar dengan jumlah hari.
  • myTruck.calculateRentalCost(rentalDays) memanggil versi calculateRentalCost() di Truck, yang menambahkan heavyDutyFee.
  • myLuxuryCar.calculateRentalCost(rentalDays) memanggil versi calculateRentalCost() di LuxuryCar, yang menambahkan luxuryFee.
Meskipun semua objek bertipe Vehicle, metode calculateRentalCost() yang dipanggil sesuai dengan tipe objek yang sebenarnya (Car, Truck, atau LuxuryCar). Ini adalah hasil dari overriding yang didukung oleh polimorfisme.

Materi







Sourcecode




Pengumpulan Tugas


Latihan :

Buatlah sistem reservasi tiket pesawat yang mendukung tiga jenis kelas penerbangan:

  1. Ekonomi
  2. Bisnis
  3. First Class

Setiap kelas penerbangan memiliki perhitungan tarif yang berbeda-beda. Selain itu, setiap kelas juga memiliki kebijakan khusus, seperti fasilitas tambahan, batas bagasi, atau layanan yang disediakan.

Struktur Kelas:

  1. Kelas Ticket adalah kelas dasar atau superclass yang berfungsi sebagai kelas umum untuk semua jenis reservasi tiket pesawat.
  2. Kelas EconomyTicket, BusinessTicket, dan FirstClassTicket adalah subclass yang mewarisi dari Ticket. Setiap subclass mengoverride metode calculateFare() untuk menentukan tarif sesuai kelas penerbangan.
  3. Ketentuan Diskon ticket

·  EconomyTicket memberikan diskon 10%.

·  BusinessTicket menambahkan biaya 25%.

·  FirstClassTicket menambahkan biaya 50%.


Referensi : Buku Object First Java

DOME source code

Absensi Kelas 





PBO-Memperbaiki Struktur dengan Inheritance


Pengantar Inheritance

Inheritance (pewarisan) adalah mekanisme dalam pemrograman berorientasi objek (OOP) yang memungkinkan sebuah kelas (child class) untuk mewarisi atribut dan metode dari kelas lain (parent class). Tujuannya adalah untuk meningkatkan struktur program, menghindari pengulangan kode, dan meningkatkan keterbacaan serta pemeliharaan kode.

Manfaat Inheritance

Inheritance memberikan berbagai manfaat struktural pada kode:

  • Reusabilitas Kode: Memungkinkan reuse kode yang sudah ada pada parent class di child class.
  • Konsistensi dan Keterbacaan: Dengan inheritance, struktur aplikasi dapat diatur secara hierarkis sehingga alur logika dan struktur program menjadi lebih jelas.
  • Pemeliharaan Kode Lebih Mudah: Jika perubahan diperlukan pada fitur umum, kita hanya perlu mengubahnya di parent class, dan semua child class otomatis mewarisi perubahan tersebut.
Untuk penjelasan lebih lanjut akan dibahas tentang Network Example. 

Studi kasus The Network Project dalam buku Object First oleh David Barnes memperkenalkan konsep-konsep dasar dari pemrograman berorientasi objek (OOP) melalui simulasi aplikasi jejaring sosial sederhana. Tujuan utamanya adalah memberikan pemahaman tentang bagaimana struktur program dapat diatur dan ditingkatkan menggunakan konsep OOP seperti inheritance, encapsulation, dan polymorphism.



Deskripsi Proyek

The Network Project bertujuan untuk membuat prototipe aplikasi jejaring sosial yang sangat sederhana. Dalam konteks ini, proyek hanya mencakup bagian kecil dari fitur dasar sebuah aplikasi jejaring sosial, seperti mengelola pengguna, menambahkan postingan, dan memanipulasi data pengguna.

Struktur dan Kelas Utama

Pada intinya, proyek ini memiliki beberapa kelas utama yang menggambarkan entitas sosial dalam aplikasi jejaring sosial:

  • User: Kelas User merepresentasikan individu pengguna dalam aplikasi. Atributnya mungkin termasuk username, name, dan status. Metode di dalamnya memungkinkan interaksi seperti meng-update status dan melihat informasi profil.

  • Post: Kelas Post menggambarkan sebuah postingan yang bisa dibuat oleh pengguna. Setiap postingan mungkin memiliki atribut seperti content, timestamp, author, dan likes. Metode pada kelas ini mungkin mencakup tindakan untuk menambah atau menghapus like.

  • Network: Kelas Network berperan sebagai tempat untuk menyimpan daftar pengguna dan postingan dalam aplikasi. Kelas ini memungkinkan fungsi untuk menambah atau menghapus pengguna serta memanipulasi daftar postingan yang tersedia di aplikasi.

Implementasi Inheritance dalam Proyek

Studi kasus ini bisa mencakup penggunaan inheritance dalam menambah fitur pada aplikasi. Contohnya:

  • Inheritance pada User Type: Anda bisa mengembangkan aplikasi ini dengan menambahkan beberapa tipe pengguna yang berbeda. Misalnya, Anda bisa membuat subclass AdminUser atau RegularUser, yang masing-masing memiliki akses dan hak yang berbeda dalam sistem.
  • Polymorphism untuk Aksi Postingan: Dengan menerapkan inheritance pada Post, kita bisa membuat jenis-jenis postingan yang berbeda, seperti ImagePost atau TextPost. Setiap jenis postingan bisa memiliki cara yang berbeda dalam menampilkan konten atau mengolah data.


Encapsulation dan Akses Kontrol

Encapsulation atau pengkapsulan digunakan untuk melindungi data internal pada setiap kelas. Misalnya:

  • Data pribadi dari User harus diakses melalui metode getter dan setter, bukan secara langsung.
  • Atribut content pada Post sebaiknya bersifat private atau protected untuk menjaga integritas data.

Contoh Kasus Penggunaan

  • Menambahkan User: Administrator dapat menambah pengguna baru ke jaringan menggunakan metode di kelas Network.
  • Memposting Status: Pengguna dapat membuat objek Post baru yang berisi status atau gambar. Posting ini akan ditambahkan ke daftar posting di kelas Network.
  • Interaksi pada Postingan: Pengguna dapat menambah atau menghapus "like" pada posting, yang ditangani melalui metode di dalam kelas Post.

Manfaat dari Struktur OOP di The Network Project

Studi kasus ini menunjukkan bahwa dengan struktur OOP:

  • Program lebih modular dan mudah untuk dikembangkan lebih lanjut.
  • Kode lebih mudah dipelihara, karena tiap kelas bertanggung jawab atas fungsinya sendiri.
  • Fleksibilitas untuk memperluas sistem tanpa mengubah struktur dasar kode berkat penerapan inheritance dan encapsulation.

Peluang Pengembangan Lanjutan

  • Menambah Komentar pada Postingan: Dengan membuat subclass Comment, kita dapat mengimplementasikan fitur komentar yang dapat ditautkan ke objek Post.
  • Follower System: Dengan menambahkan atribut followers dan following pada kelas User, pengguna bisa mengikuti satu sama lain, mirip dengan aplikasi media sosial modern.
  • Pengelolaan Data: Peningkatan pada struktur data, misalnya dengan menggunakan koleksi (list, map) yang lebih efisien untuk menampung pengguna dan postingan.



Latihan

Aplikasi Rental Kendaraan

Deskripsi: Buatlah sebuah sistem manajemen rental untuk berbagai jenis kendaraan. Semua kendaraan memiliki merk, model, dan tahunProduksi. Khusus untuk Mobil dan Motor, tambahkan atribut jumlahRoda. Sementara untuk Sepeda, tambahkan atribut jenis Sepeda (misalnya BMX, balap).

  1. Buat rancangan class diagram dengan menggunakan inheritance
  2. Buat aplikasi yang bisa menampilkan list kendaraan yang tersedia, dan juga daftar nama penyewa beserta informasi detail kendaraan yang disewa


Solusi Lain network application