Menu
Coddy logo textTech

Neden Çoklu Sınıf Kalıtımı Yok?

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 26 / 87.

Java, bir sınıfın birden fazla sınıfı genişletmesini kasten engeller. Bu kısıtlama, Diamond Problem olarak bilinen bir sorun nedeniyle mevcuttur.

Java'nın çoklu kalıtıma izin verdiğini hayal edin. Şu varsayımsal senaryoyu düşünün:

// Bu kod Java'da geçerli DEĞİLDİR
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");
    }
}

// Java'da izin verilmez!
public class D extends B, C { }

Bir D nesnesi üzerinde greet() metodunu çağırdıysanız, hangi sürüm çalışmalı? B'den gelen mi yoksa C'den gelen mi? Bu belirsizlik, kalıtım diyagramının oluşturduğu elmas şeklinden adını alan Elmas Problemi'dir (Diamond Problem).

Java'nın çözümü basittir: sınıfların yalnızca tekli kalıtımına izin verir. Ancak, Java bir alternatif sunar. Bir sınıf, gelecek bir bölümde öğreneceğiniz birden fazla arayüzü uygulayabilir.

Arayüzler elmas problemini farklı şekilde çözer ve size belirsizlik olmadan esneklik sağlar.

// Bu Java'da geçerlidir
public class Dog extends Animal implements Runnable, Comparable<Dog> {
    // Birden fazla arayüz uygulanabilir
}

Bu tasarım tercihi, Java'nın kalıtım modelini temiz ve öngörülebilir tutarken, arayüzler aracılığıyla güçlü kod yeniden kullanımına olanak tanır.

challenge icon

Görev

Kolay

Java'nın tekli kalıtım kuralını gösteren ve bu kısıt içinde nasıl esnek tasarımlar oluşturabileceğinizi ortaya koyan bir müzik çalar sistemi oluşturalım.

Bir müzik çaların ve sesli asistanın özelliklerini birleştiren akıllı bir hoparlör oluşturmak istediğinizi düşünün. Java birden fazla sınıfı extends etmeye izin vermediğinden, tekli kalıtımı kullanarak hiyerarşinizi dikkatlice tasarlamanız gerekir.

Kodunuzu düzenlemek için dört dosya oluşturacaksınız:

  • AudioDevice.java: Tüm ses çalan cihazların ortak kullanacağı temel sınıfı oluşturun. Şunlara sahip olmalıdır:
    • deviceName (String) için private bir alan
    • Cihaz adını kabul eden bir constructor
    • Adı döndüren bir getDeviceName() metodu
    • Şunu yazdıran bir playSound() metodu: [deviceName]: Playing audio
  • MusicPlayer.java: AudioDevice sınıfını extends eden ve müziğe özgü özellikler ekleyen bir sınıf oluşturun:
    • currentSong (String) için private bir alan
    • Cihaz adını alan ve super(deviceName) kullanan bir constructor
    • Mevcut şarkıyı ayarlayan bir setSong(String song) metodu
    • Şunu yazdıracak şekilde playSound() metodunu override edin: [deviceName]: Now playing - [currentSong]
  • SmartSpeaker.java: MusicPlayer sınıfını extends eden bir sınıf oluşturun (hem MusicPlayer hem de bir VoiceAssistant sınıfını extends etmeyin; bu multiple inheritance olur!). Akıllı hoparlör, ses özellikleri ekleyerek müzik çaların üzerine inşa edilir:
    • assistantName (String) için private bir alan
    • Cihaz adını ve asistan adını alan, super(deviceName) kullanan bir constructor
    • Şunu yazdıran bir voiceCommand(String command) metodu: [assistantName]: Processing "[command]"
    • Şunu yazdıran bir getFullInfo() metodu: [deviceName] with [assistantName] assistant
  • Main.java: Çok seviyeli kalıtım zincirinizi gösterin. Üç girdi alacaksınız: bir cihaz adı (String), bir asistan adı (String) ve bir şarkı adı (String). Bir SmartSpeaker oluşturun, bir şarkı ayarlayın ve ardından şu metotları sırayla çağırın:
    • getFullInfo()
    • playSound()
    • voiceCommand("skip to next")

Üç girdi alacaksınız: cihaz adı, asistan adı ve şarkı adı.

SmartSpeaker'ın birden fazla ilgisiz sınıfı extends etmeye çalışmak yerine, bir zincir içinde (AudioDevice -> MusicPlayer -> SmartSpeaker) MusicPlayer'ı extends ederek müzik özellikleri kazandığına dikkat edin. Java'nın kalıtımı düzenli ve belirsizlikten uzak tutma yaklaşımı budur!

Kendin dene

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Girdileri oku
        String deviceName = scanner.nextLine();
        String assistantName = scanner.nextLine();
        String songName = scanner.nextLine();
        
        // TODO: deviceName ve assistantName ile bir SmartSpeaker oluşturun
        
        // TODO: setSong() kullanarak şarkıyı ayarlayın
        
        // TODO: getFullInfo() metodunu çağırın
        
        // TODO: playSound() metodunu çağırın
        
        // TODO: voiceCommand("skip to next") metodunu çağırın
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online Java derleyicisi