Menu
Coddy logo textTech

Soyut Sınıflar ve Metotlar

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

Bazen bir taslak görevi gören ancak asla doğrudan örneklendirilmemesi gereken bir sınıf tanımlamak istersiniz. Örneğin, genel bir Shape sınıfı bir ebeveyn olarak mantıklıdır, ancak belirli bir formu olmayan bir "şekil" neye benzer? İşte burada soyut sınıflar (abstract classes) devreye girer.

Bir soyut sınıf (abstract class), abstract anahtar kelimesi ile bildirilir ve örneği oluşturulamaz. Hem uygulamaları olan normal metotları hem de gövdesi olmayan soyut metotları içerebilir:

public abstract class Shape {
    protected String color;
    
    public Shape(String color) {
        this.color = color;
    }
    
    // Soyut metot - uygulama yok
    public abstract double getArea();
    
    // Normal metot - uygulaması var
    public String getColor() {
        return color;
    }
}

Soyut metotlar bir alt sınıfın ne yapması gerektiğini bildirir, ancak nasıl yapacağını bildirmez. Bir soyut sınıfı genişleten soyut olmayan herhangi bir sınıf, tüm soyut metotlar için uygulamalar sağlamalıdır:

public class Circle extends Shape {
    private double radius;
    
    public Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }
    
    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

Soyut sınıfları hala referans tipleri olarak kullanabilir ve polimorfizme olanak tanıyabilirsiniz:

Shape shape = new Circle("red", 5.0);
System.out.println(shape.getArea());  // Circle'ın uygulamasını çağırır

Soyut sınıflar, alt sınıflar ortak kod paylaştığında ancak her birinin belirli davranışları farklı şekilde uygulaması gerektiğinde idealdir. Kodun yeniden kullanımına izin verirken bir sözleşmeyi zorunlu kılarlar.

challenge icon

Görev

Kolay

Soyut sınıfların gücünü gösteren bir beyaz eşya sistemi inşa edelim. Her beyaz eşyanın ne yapması gerektiğini tanımlayan temel bir Appliance sınıfı oluşturacaksınız ve belirli beyaz eşya türlerinin bunu tam olarak nasıl yapacağına karar vermesine izin vereceksiniz.

Kodunuzu dört dosya halinde düzenleyeceksiniz:

  • Appliance.java: Tüm beyaz eşyalar için taslak görevi gören soyut bir sınıf oluşturun. Her beyaz eşyanın bir brand alanı (String) ve bir wattage alanı (int) vardır. Her iki alanı da başlatan bir yapıcı (constructor), her biri için getter metotları ve şu formatta bir dize döndüren normal bir getInfo() metodu ekleyin: [brand] - [wattage]W. Alt sınıfların uygulaması gereken soyut bir operate() metodu tanımlayın - bu, her beyaz eşyanın ana işlevini nasıl yerine getirdiğini temsil eder.
  • WashingMachine.java: Appliance sınıfını genişleten somut bir sınıf oluşturun. Çamaşır makinelerinin, kg cinsinden yük miktarını temsil eden ek bir capacity alanı (int) vardır. Üst sınıfın başlatılmasını yönetmek için super kullanın. operate() metodunu şu çıktıyı verecek şekilde uygulayın: [brand] washing machine is washing [capacity]kg of clothes
  • Microwave.java: Appliance sınıfını genişleten başka bir somut sınıf oluşturun. Mikrodalga fırınların, güç seviyesi yüzdesini temsil eden bir power alanı (int) vardır. operate() metodunu şu çıktıyı verecek şekilde uygulayın: [brand] microwave is heating at [power]% power
  • Main.java: Polimorfizm (çok biçimlilik) kullanarak her şeyi bir araya getirin. Beş girdi alacaksınız: bir marka adı, watt değeri, çamaşır makinesi kapasitesi, başka bir marka adı ve mikrodalga güç seviyesi. Bir WashingMachine ve bir Microwave oluşturun, ardından bunları bir Appliance referans dizisinde saklayın. Diziyi döngüye alın ve her beyaz eşya için getInfo() kullanarak bilgilerini yazdırın, ardından operate() metodunu çağırın.

Şu sırayla beş girdi alacaksınız: ilk marka (String), ilk watt değeri (int), kg cinsinden kapasite (int), ikinci marka (String) ve güç seviyesi (int).

Çıktınız dört satır göstermelidir - her beyaz eşya için önce bilgi satırını, ardından çalışma davranışını göreceksiniz. Soyut sınıfın, her biri kendine özgü bir şekilde çalışırken farklı beyaz eşyalara tek tip davranmanıza nasıl izin verdiğine dikkat edin!

Kopya kağıdı

Bir soyut sınıf (abstract class), abstract anahtar kelimesi ile bildirilir ve doğrudan örneklendirilemez. Alt sınıflar için bir taslak görevi görür:

public abstract class Shape {
    protected String color;
    
    public Shape(String color) {
        this.color = color;
    }
    
    // Soyut metot - uygulama yok
    public abstract double getArea();
    
    // Normal metot - uygulaması var
    public String getColor() {
        return color;
    }
}

Soyut metotların gövdesi yoktur ve soyut olmayan alt sınıflar tarafından uygulanmalıdır:

public class Circle extends Shape {
    private double radius;
    
    public Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }
    
    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

Soyut sınıflar, polimorfizm (çok biçimlilik) için referans tipleri olarak kullanılabilir:

Shape shape = new Circle("red", 5.0);
System.out.println(shape.getArea());  // Circle'ın uygulamasını çağırır

Soyut sınıflar, alt sınıflar ortak kodu paylaştığında ancak belirli davranışları farklı şekilde uygulamaları gerektiğinde idealdir.

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Girdileri oku
        String brand1 = scanner.nextLine();
        int wattage1 = scanner.nextInt();
        int capacity = scanner.nextInt();
        scanner.nextLine(); // yeni satırı tüket
        String brand2 = scanner.nextLine();
        int power = scanner.nextInt();
        
        // TODO: brand1, wattage1 ve capacity ile bir WashingMachine nesnesi oluşturun
        
        // TODO: brand2, wattage1 (veya uygun wattage) ve power ile bir Microwave nesnesi oluşturun
        
        // TODO: Appliance referanslarından oluşan bir dizi oluşturun ve her iki nesneyi de saklayın
        
        // TODO: Diziyi döngüye alın ve her bir cihaz için:
        // - getInfo() kullanarak bilgilerini yazdırın
        // - operate() 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