Abstract class, abstract olarak işaretlenmiş bir temel sınıftır. new ile oluşturulamaz ve gövdesi olmayan abstract metotlar bildirebilir; bunları her alt sınıf implement etmek zorundadır.
Shape, describe() metodunu her alt sınıfla paylaşır ve her birini area() metodunu sağlamaya zorlar. Shape[] tipi alt sınıfların her türlü karışımını tutabilir.
Abstract Class'ın Örneği Oluşturulamaz
Bir abstract class üzerinde new çağırmak bir derleme hatasıdır, çünkü ortaya çıkan nesnenin implementasyonu olmayan metotları olurdu:
index.ts(6,11): error TS2511: Cannot create an instance of an abstract class.
Bu bir derleme zamanı kuralıdır. abstract çıktıdan silinir, bu yüzden üretilen Shape sıradan bir JavaScript sınıfıdır ve tipsiz JavaScript kodu yine de new Shape() çağırabilir. Bir kütüphanenin çalışma zamanında bir korumaya ihtiyacı olduğunda constructor new.target değerini kontrol edebilir:
Abstract Metotlar ve Özellikler
Bir alt sınıf her abstract üyeyi implement etmek ya da kendisi abstract olmak zorundadır. Birini eksik bırakmak, Non-abstract class 'Square' does not implement inherited abstract member area from class 'Shape' gibi okunan TS2515 hatasıdır; birkaç üye eksikse hepsini listeleyen TS2654 hatası gelir.
Alanlar, getter'lar ve metotların hepsi abstract olabilir ve protected olabilir:
Bir abstract metodun gövdesi yoktur; gövde yazmak TS1245 hatasıdır (Method 'x' cannot have an implementation because it is marked abstract). Bir abstract class'ın hiç abstract üyesi olmak zorunda değildir: tek başına abstract yalnızca doğrudan örnek oluşturmayı engeller.
Template Method Kalıbı
Abstract class yazmanın en yaygın nedeni: temel sınıf adımların sırasını sabitler, her alt sınıf da değişen adımları doldurur.
Buradaki gibi abstract class'lar generic olabilir; böylece her alt sınıf kayıt tipini kendisi seçer.
Abstract Constructor Tipleri
Bir abstract class için typeof Shape, çağırmanıza izin verilmeyen bir constructor'dır; bu yüzden typeof Shape olarak tiplenmiş bir parametre new c() yapamaz. Bir fonksiyonun abstract class'ları kabul etmesi gerektiğinde (örneğin onları kaydetmek ya da instanceof kontrolü yapmak için), onu abstract bir construct imzasıyla tipleyin:
abstract new hem abstract hem de somut sınıfları kabul eder; düz new ise yalnızca somut olanları kabul eder.
Abstract Class ve Interface
| Abstract class | Interface | |
|---|---|---|
| Kod içerir mi | evet: metotlar, alan başlatıcıları, constructor | hayır, yalnızca tipler |
| Çalışma zamanında var mı | evet | hayır, silinir |
instanceof | çalışır | mümkün değil |
| Bir sınıf kaç tane kullanabilir | bir tane (extends) | birçok (implements) |
| Erişim belirleyiciler | private, protected, public | yalnızca public üyeler |
| Düz nesneler için tip olarak | yalnızca private/protected üyesi yoksa, ve o zaman instanceof başarısız olur | evet, o biçime sahip her değer |
Genel kural: yalnızca bir biçimi tarif etmeniz gerekiyorsa interface (en yaygın durum ve nesne literalleri için de çalışır), alt sınıflar gerçek bir implementasyonu paylaşıyorsa ve derleyicinin onları boşlukları doldurmaya zorlamasını istiyorsanız abstract class. İkisi iyi birleşir: public sözleşme için bir interface, onu implement eden kullanışlı bir temel olarak da bir abstract class. Diğer yaygın karşılaştırma için interface ve type sayfasına bakın.
Sık Yapılan Hatalar
- Bir interface'in yeteceği yerde abstract class kullanmak. Temel sınıfın hiç kodu yoksa, fazladan çalışma zamanı yükü ve tekli kalıtım sınırı olan bir interface'ten farkı yoktur.
static abstractdenemek. İzin verilmez. Statik üyeler abstract olamaz.- Abstract class üzerinde
newkullanıldığında çalışma zamanı hatası beklemek.new.targetkontrolünü siz yazmadıkça hata yoktur. - Temel constructor'dan abstract bir metot çağırmak. Bu çağrı alt sınıfın alanları başlatılmadan önce çalışır, bu yüzden implementasyon onları
undefinedolarak görür.
Sıkça Sorulan Sorular
TypeScript'te abstract class nedir?
abstract olarak işaretlenmiş, new ile oluşturulamayan ve implementasyonu olmayan abstract üyeler bildirebilen bir sınıftır. Alt sınıflar her abstract üyeyi implement etmek zorundadır. Aynı anda hem kod paylaşmanın hem de bir biçimi zorunlu kılmanın bir yoludur.
TypeScript'te abstract class ile interface arasındaki fark nedir?
Bir abstract class gerçek kod içerebilir (implement edilmiş metotlar, başlangıç değeri olan alanlar, bir constructor) ve çalışma zamanında vardır, bu yüzden onunla instanceof çalışır; bir sınıf yalnızca birini genişletebilir. Bir interface'in kodu yoktur, derleme zamanında silinir ve bir sınıf birçoğunu implement edebilir. Davranış paylaşmak için abstract class, bir biçimi tarif etmek için interface kullanın.
TypeScript'te bir abstract class'ın constructor'ı olabilir mi?
Evet. Bir alt sınıf super(...) çağırdığında çalışır. Yine de abstract class'ın kendisi üzerinde new çağıramazsınız (TS2511: Cannot create an instance of an abstract class).
TypeScript'te statik metotlar abstract olabilir mi?
Hayır. abstract yalnızca örnek üyelerine uygulanır; static abstract, TS1243 hatasıdır ('static' modifier cannot be used with 'abstract' modifier). Statik bir biçimi zorunlu kılmak için constructor'ı statik üyeyi içeren bir interface ile tipleyin ve sınıfı ona karşı kontrol edin.
Abstract class çalışma zamanında korunur mu?
Hayır. abstract silinir, bu yüzden derlenmiş sınıf sıradan bir JavaScript sınıfıdır ve düz JavaScript kodu onu yine new ile çağırabilir. Bu önemliyse constructor içinde new.target kontrolü yapıp hata fırlatın.