Soyut Sınıf
- İ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
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
- InterfaceProgramlamanın Temelleri, s. 29Interface, bir türün sağlamayı vaat ettiği metot ve özellik imzalarından oluşan adlandırılmış bir kümedir; bu üyelerin nasıl gerçekleştirildiğini söylemez.
- SoyutlamaProgramlamanın Temelleri, s. 56Soyutlama, bir şeyin nasıl çalıştığına dair karmaşık ayrıntıları daha basit bir arayüzün arkasına gizlemektir; kod onu yalnızca ne yaptığını bilerek kullanır.
- KalıtımProgramlamanın Temelleri, s. 34Kalıtım, yeni bir sınıfın mevcut bir sınıfın alanlarını ve metotlarını yeniden kullanmasını, genişletmesini ve geçersiz kılmasını sağlayan OOP özelliğidir.
- SınıfProgramlamanın Temelleri, s. 54Sınıf, nesne yönelimli programlamada bir grup nesnenin paylaştığı veri ve davranışı tanımlayan, nesnelerin örnek olarak ondan oluşturulduğu bir plandır.
- Çok biçimlilikProgramlamanın Temelleri, s. 11Çok biçimlilik, kodun farklı türlerdeki değerlerle ortak bir arayüz üzerinden çalışabilmesidir; her tür kendi davranışını sağlar.
- OOPProgramlamanın Temelleri, s. 46OOP, yani nesne yönelimli programlama, kodu ilişkili verileri onlar üzerinde işlem yapan fonksiyonlarla birleştiren nesneler etrafında düzenleme yöntemidir.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin