CodeBlanks Logo Icon CodeBlanks

Soyut sınıf vs interface

Soyut sınıf ve interface farkını öğrenirsin.

Soyut sınıf vs interface

Abstract sınıf ve interface benzer sözleşmeler sağlar ama farklıdır. Abstract sınıf durum (alan) ve somut metot taşır; tek sınıf extends eder. Interface durum taşımaz (sabit hariç); birden çok sınıf implements eder.

Örnek: abstract class Account { double balance; abstract void deposit(double amount); } abstract sınıftır; balance alanı vardır. interface Printable { void print(); } ise interface'tir; alan içermez. Bir sınıf tek abstract sınıfı extends eder ama birden çok interface'i implements eder. Paylaşılan durum ve ortak metot gerekiyorsa abstract sınıf; yalnızca sözleşme gerekiyorsa interface seçilir. Doğru araç, tasarımın ihtiyacına bağlıdır.

Ortak durum için abstract

Abstract sınıf, alt sınıfların paylaştığı durum ve davranışı taşımak için idealdir. Interface durum tutamaz; bu yüzden ortak alan gerektiğinde abstract sınıf seçilir.

Örnek: bir banka hesabı hiyerarşisinde balance alanı tüm alt sınıflarda gerekli ise, abstract class Account { double balance; } yazarsın. Bu alanı her alt sınıf tekrar tanımlamaz. Aynı şekilde void deposit ve void withdraw ortak metotları abstract sınıfta toplanır. Interface ile bu mümkün değildir. Abstract sınıf, 'is-a' ilişkisini temsil eder; interface 'can-do' ilişkisini. Doğru seçim, sınıf hiyerarşisini sade tutar.

Uygulama Account abstract sınıfını tanımla

Account adında bir abstract sınıf tanımla. İçine double balance alanını ekle ve yapıcı Account(double balance) yaz; alanı ata. abstract void deposit(double amount) imzasını ekle. class SavingsAccount extends Account yaz; yapıcı SavingsAccount(double balance) ile üst yapıcıyı super(balance) çağır. public void deposit(double amount) metodunu yaz; gövdesi balance += amount; ve System.out.println("Yeni bakiye: " + balance); içersin. main içinde SavingsAccount a = new SavingsAccount(100); ile a.deposit(50) çağır.

Başlangıç kodu

Main.java
// Soyut Account sınıfını tanımla
// balance alanı ve abstract deposit ekle
// SavingsAccount alt sınıfını yaz
// main'de deposit çağır

Örnek çözüm

Main.java
abstract class Account {
    double balance;
    Account(double balance) {
        this.balance = balance;
    }
    abstract void deposit(double amount);
}
class SavingsAccount extends Account {
    SavingsAccount(double balance) {
        super(balance);
    }
    public void deposit(double amount) {
        balance += amount;
        System.out.println("Yeni bakiye: " + balance);
    }
}
class Main {
    public static void main(String[] args) {
        SavingsAccount a = new SavingsAccount(100);
        a.deposit(50);
    }
}

Beklenen çıktı

Yeni bakiye: 150.0

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Sınıf ilişkisini tamamla

Soru
class SavingsAccount ____ Account {
    public void deposit(double amount) { }
}
Cevap
class SavingsAccount extends Account {
    public void deposit(double amount) { }
}

Açıklama: extends kelimesi abstract sınıfı miras alır.

2 Hangi durumda abstract sınıf interface'e tercih edilir?

  • Sadece sözleşme gerektiğinde
  • Ortak durum ve metot gerektiğinde Doğru cevap
  • Hiçbir zaman
  • Çoklu kalıtım gerektiğinde

Açıklama: Ortak durum ve metot abstract sınıfı gerektirir.

3 Soyut sınıf ve interface farklarını eşle

Kavram Anlamı
abstract class Durum taşır
interface Sözleşme taşır
extends Tek miras
implements Çoklu uygulama

Orta seviye bölümündeki tüm dersler