# Soyut Sınıf

Adres: https://softwaredictionary.org/tr/terimler/abstract-class
Kategori: Programlamanın Temelleri
Son güncelleme: 2026-10-06
İngilizcesi: Abstract Class
Okunuşu: ebstrekt klas

Kısaca: Soyut sınıf, tek başına örneklenemeyen bir sınıftır; alt sınıflarıyla kod paylaşır ve her alt sınıfın gerçekleştirmesi gereken metotları bildirir.

## Soyut sınıf nedir?

Soyut sınıf, yalnızca genişletilmek için var olan bir sınıftır. Ondan doğrudan nesne oluşturamazsınız; başka sınıflar ondan kalıtım alır ve eksik kalan kısımları tamamlar. Normal bir sınıfın sahip olabileceği her şeyi, yani alanları, bir yapıcı metodu ve eksiksiz yazılmış metotları barındırabilir; bunlara ek olarak soyut metotlar içerir: adı ve parametreleri olan ama gövdesi olmayan, kendisi de soyut olmadığı sürece her alt sınıfın gerçekleştirmek zorunda olduğu metotlar.

Java, C#, Kotlin ve TypeScript böyle bir sınıfı `abstract` anahtar sözcüğüyle işaretler; derleyici hem `new Shape()` ifadesini hem de soyut bir metodu atlayan her alt sınıfı reddeder. Python aynı etkiyi standart `abc` modülüyle elde eder: `ABC` sınıfından kalıtım alan ve metotlarını `@abstractmethod` ile işaretleyen bir sınıf, bir alt sınıf bu metotları gerçekleştirene kadar örneklenemez. C++'ta bunun için bir anahtar sözcük yoktur; `= 0` ile yazılan en az bir saf sanal fonksiyonu (pure virtual function) olan her sınıf soyuttur.

Soyut sınıflar, gerçek kod paylaşan tür aileleri için uygundur. Bir `Shape` sınıfı `describe()` metodunu bir kez yazıp `area()` metodunu soyut bırakabilir; böylece `Circle` ve `Square` yalnızca kendi formüllerini yazar. Buna template method (şablon metot) deseni denir: temel sınıf bir algoritmanın adımlarını sabitler ve bazılarını alt sınıfların doldurmasına bırakır; tıpkı bazı alanları önceden doldurulmuş, geri kalanı herkesin kendisi için boş bırakılmış basılı bir form gibi.

Klasik soru, soyut sınıf ile interface arasındaki farktır. Interface durum tutmayan bir sözleşmedir ve bir sınıf birçoğunu uygulayabilir; soyut sınıf ise alanlar, bir yapıcı metot ve ortak kod da taşıyabilir, ancak Java, C# ve TypeScript'te bir sınıf yalnızca bir sınıfı genişletebilir. Java 8 ve C# 8'den bu yana interface'ler varsayılan metot gövdeleri içerebiliyor ve bu da sınırı bulanıklaştırıyor; yine de örnek alanları (instance field) ve yapıcı metotlar hâlâ yalnızca sınıflara ait. İyi bir kural: bir şeyin ne yapabildiğini tarif etmek için interface, ilişkili türlerin bunu nasıl yaptığını paylaşmak için soyut sınıf kullanın.

## Önemli noktalar

- Soyut sınıf örneklenemez; genişletilmek için vardır.
- Alanları ve eksiksiz yazılmış metotları, gövdesi olmayan soyut metotlarla bir arada barındırabilir.
- Kendisi soyut olmayan her alt sınıf, bütün soyut metotları gerçekleştirmek zorundadır.
- Java, C# ve TypeScript'te bir sınıf birçok interface uygulayabilir ama yalnızca bir sınıfı genişletebilir.

## Örnek: TypeScript'te ortak kod ve soyut bir metot içeren bir soyut sınıf

```typescript
abstract class Shape {
  constructor(public readonly name: string) {}
  abstract area(): number;            // no body: each subclass must write one
  describe(): string {                // shared code that every subclass inherits
    return `${this.name} has an area of ${this.area().toFixed(1)}`;
  }
}

class Circle extends Shape {
  constructor(private radius: number) { super("circle"); }
  area() { return Math.PI * this.radius ** 2; }
}

new Circle(2).describe(); // "circle has an area of 12.6"
// new Shape("blob");     // error: Cannot create an instance of an abstract class.
```

## Sık sorulan sorular

**Soyut sınıf ile interface arasındaki fark nedir?**

Interface yalnızca bir türün neler yapabildiğini bildirir ve bir sınıf birkaçını uygulayabilir. Soyut sınıf ise alanlar, bir yapıcı metot ve ortak metot kodu da tutabilir, ancak bir sınıf yalnızca birini genişletebilir. Bir yetenek için interface, birbiriyle ilişkili türlerden oluşan bir ailenin paylaştığı davranış için soyut sınıf kullanın.

**Soyut sınıfın yapıcı metodu olabilir mi?**

Evet. Onu `new` ile doğrudan çağıramazsınız, ama her alt sınıf, soyut sınıfın tanımladığı alanları hazırlamak için onu örneğin `super(...)` ile çağırır.

**Python'da soyut sınıf var mı?**

Anahtar sözcük olarak yok, ama standart `abc` modülü bu imkânı sağlar. `ABC` sınıfından kalıtım alıp metotları `@abstractmethod` ile işaretlerseniz, her soyut metot gerçekleştirilmeden bir nesne oluşturmaya çalıştığınızda Python bir `TypeError` fırlatır.

## Kaynaklar

- [The Java Tutorials: Abstract Methods and Classes](https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html)
- [Python documentation: abc — Abstract Base Classes](https://docs.python.org/3/library/abc.html)
- [TypeScript Handbook: Classes](https://www.typescriptlang.org/docs/handbook/2/classes.html)

---

Software Dictionary: https://softwaredictionary.org/tr · https://softwaredictionary.org/tr/llms.txt
