Ana içeriğe geç

Soyut Sınıf

İngilizcesi
Abstract Class
Okunuşu
ebstrekt klas
Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/abstract-class

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ıftypescript
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.

İlgili sayfalar

Kaynaklar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar