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 mewarisi 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 di 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 di 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 dari diagram pewarisan.

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

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 kuat melalui interface.

challenge icon

Tantangan

Mudah

Mari buat sistem pemutar musik yang menunjukkan aturan pewarisan tunggal Java dan memperlihatkan bagaimana kamu tetap dapat membuat desain yang fleksibel dalam batasan ini.

Bayangkan kamu ingin membuat speaker pintar 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 dimiliki bersama oleh semua perangkat pemutar audio. Class ini harus memiliki:
    • Field private untuk deviceName (String)
    • Konstruktor yang menerima nama perangkat
    • Method getDeviceName() yang mengembalikan namanya
    • Method playSound() yang mencetak: [deviceName]: Playing audio
  • MusicPlayer.java: Buat class yang mewarisi AudioDevice dan menambahkan fitur khusus musik:
    • Field private untuk currentSong (String)
    • Konstruktor yang menerima nama perangkat dan menggunakan super(deviceName)
    • Method setSong(String song) yang menetapkan lagu saat ini
    • Override playSound() agar mencetak: [deviceName]: Now playing - [currentSong]
  • SmartSpeaker.java: Buat class yang mewarisi MusicPlayer, bukan MusicPlayer dan class VoiceAssistant sekaligus, karena itu termasuk pewarisan berganda! Speaker pintar ini mengembangkan pemutar musik dengan menambahkan fitur suara:
    • Field private 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, tetapkan 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 memutar musik dengan mewarisi MusicPlayer dalam sebuah rantai (AudioDevice -> MusicPlayer -> SmartSpeaker), alih-alih mencoba mewarisi beberapa class yang tidak berkaitan. Inilah pendekatan Java untuk 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