Menu
CoddyTech

Mengapa Tidak Ada Pewarisan Multi-Kelas

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 26 dari 87.

Java sengaja mencegah sebuah class memperluas lebih dari satu class. Pembatasan ini ada karena masalah yang dikenal sebagai Diamond Problem.

Bayangkan jika Java mengizinkan pewarisan berganda. Pertimbangkan skenario hipotetis ini:

// Kode ini TIDAK valid dalam Java
public class A {
    public void greet() {
        System.out.println("Hello from A");
    }
}

public class B extends A {
    @Override
    public void greet() {
        System.out.println("Hello from B");
    }
}

public class C extends A {
    @Override
    public void greet() {
        System.out.println("Hello from C");
    }
}

// TIDAK diizinkan dalam Java!
public class D extends B, C { }

Jika kamu memanggil greet() pada object D, versi mana yang seharusnya dijalankan? Versi dari B atau C? Ambiguitas ini disebut Masalah Berlian, dinamai berdasarkan bentuk berlian yang terbentuk oleh diagram pewarisan.

Solusi Java sederhana: izinkan hanya pewarisan tunggal untuk class. Namun, Java menyediakan alternatif. Sebuah class dapat mengimplementasikan beberapa interface, yang akan kamu pelajari di bab mendatang.

Interface mengatasi masalah diamond dengan cara berbeda dan memberimu fleksibilitas tanpa ambiguitas.

// Ini MEMANG valid di Java
public class Dog extends Animal implements Runnable, Comparable<Dog> {
    // Bisa mengimplementasikan beberapa interface
}

Pilihan desain ini menjaga model pewarisan Java tetap bersih dan mudah diprediksi, sekaligus memungkinkan penggunaan ulang kode yang efektif melalui interface.

challenge icon

Tantangan

Mudah

Mari kita bangun sistem pemutar musik yang menunjukkan aturan pewarisan tunggal Java dan memperlihatkan bagaimana kamu tetap bisa membuat desain yang fleksibel dengan batasan ini.

Bayangkan kamu ingin membuat smart speaker yang menggabungkan fitur pemutar musik dan asisten suara. Karena Java tidak mengizinkan pewarisan dari beberapa class, kamu perlu merancang hierarkimu dengan cermat menggunakan pewarisan tunggal.

Kamu akan membuat empat file untuk mengatur kodemu:

  • AudioDevice.java: Buat class dasar yang digunakan bersama oleh semua perangkat pemutar audio. Class ini harus memiliki:
    • Field privat untuk deviceName (String)
    • Konstruktor yang menerima nama perangkat
    • Method getDeviceName() yang mengembalikan nama
    • Method playSound() yang mencetak: [deviceName]: Playing audio
  • MusicPlayer.java: Buat class yang mewarisi AudioDevice dan menambahkan fitur khusus musik:
    • Field privat untuk currentSong (String)
    • Konstruktor yang menerima nama perangkat dan menggunakan super(deviceName)
    • Method setSong(String song) yang mengatur lagu saat ini
    • Override playSound() agar mencetak: [deviceName]: Now playing - [currentSong]
  • SmartSpeaker.java: Buat class yang mewarisi MusicPlayer, bukan mewarisi MusicPlayer dan class VoiceAssistant sekaligus, karena itu berarti pewarisan berganda! Smart speaker mengembangkan kemampuan pemutar musik dengan menambahkan fitur suara:
    • Field privat untuk assistantName (String)
    • Konstruktor yang menerima nama perangkat dan nama asisten, menggunakan super(deviceName)
    • Method voiceCommand(String command) yang mencetak: [assistantName]: Processing "[command]"
    • Method getFullInfo() yang mencetak: [deviceName] with [assistantName] assistant
  • Main.java: Tunjukkan rantai pewarisan bertingkatmu. Kamu akan menerima tiga input: nama perangkat (String), nama asisten (String), dan nama lagu (String). Buat SmartSpeaker, atur lagu, lalu panggil method berikut secara berurutan:
    • getFullInfo()
    • playSound()
    • voiceCommand("skip to next")

Kamu akan menerima tiga input: nama perangkat, nama asisten, dan nama lagu.

Perhatikan bagaimana SmartSpeaker mendapatkan kemampuan musik dengan mewarisi MusicPlayer dalam sebuah rantai (AudioDevice -> MusicPlayer -> SmartSpeaker), alih-alih mencoba mewarisi beberapa class yang tidak berkaitan. Inilah cara Java menjaga pewarisan tetap rapi dan tidak ambigu!

Coba sendiri

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Baca input
        String deviceName = scanner.nextLine();
        String assistantName = scanner.nextLine();
        String songName = scanner.nextLine();
        
        // TODO: Buat SmartSpeaker dengan deviceName dan assistantName
        
        // TODO: Atur lagu menggunakan setSong()
        
        // TODO: Panggil getFullInfo()
        
        // TODO: Panggil playSound()
        
        // TODO: Panggil voiceCommand("skip to next")
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online