PHP
Soyut sınıf mirası
abstract sınıftan extends edip abstract methodları uygulamayı öğrenirsin.
Soyut sınıfı miras almak
Bir soyut sınıfı extends ile miras alırsın, tıpkı normal bir sınıf gibi. Ancak soyut sınıftaki tüm abstract metotları alt sınıfta uygulaman gerekir. Aksi halde PHP fatal error verir ve alt sınıf new ile örneklenemez.
Bu, soyut sınıfın alt sınıfa yüklediği bir sözleşme (contract) oluşturur: 'Bu metotları kendi başına uygulayacaksın; gerisini benden miras alacaksın'.
Bir soyut sınıftan istediğin kadar alt sınıf türetebilirsin. Her biri abstract metotları kendine göre uygular; böylece ortak davranış paylaşılır, farklılık alt sınıflarda kalır.
İki alt sınıf, iki uygulama
Aynı soyut sınıftan birden çok alt sınıf türetmek yaygındır. Her alt sınıf, abstract metotları kendine göre uygular. Bu sayede tek bir sözleşme, birden çok somut davranışa dönüşür.
Örneğin Shape soyut sınıfı area() metodunu bildirir; Circle yarıçaptan, Rectangle en ve boydan alanı hesaplar. İkisi de aynı describe() metodunu miras alır.
$c = new Circle();
$r = new Rectangle();
echo $c->describe(); // Alan: 3.14
echo $r->describe(); // Alan: 20
Tür çeşitliliği soyut sınıfta birleşir; bu, polymorphism'in temelidir.
Uygulama İki alt sınıf: Circle ve Rectangle
Shape soyut sınıfı hazır geliyor (aşağıda). Sen Circle ve Rectangle sınıflarını Shape'ten türet ve her birinde area() metodunu uygula. Circle::area() 3.14, Rectangle::area() 20 döndürsün. Sonra her iki sınıftan birer örnek yapıp describe() çıktılarını alt alta yazdır: echo $c->describe() . "\n" . $r->describe() . "\n";
Örnek çözümü göster
float metodunu yaz, sırasıyla 3.14 ve 20 döndürsün. Örnekleri new Circle() ve new Rectangle() ile oluştur, describe() çıktılarını yazdır.
Örnek çözüm:
<?php
// Shape soyut sınıfı hazır geliyor
abstract class Shape {
abstract public function area(): float;
public function describe(): string {
return "Alan: " . $this->area();
}
}
class Circle extends Shape {
public function area(): float {
return 3.14;
}
}
class Rectangle extends Shape {
public function area(): float {
return 20;
}
}
$c = new Circle();
$r = new Rectangle();
echo $c->describe() . "\n" . $r->describe() . "\n";
Kendini test et
-
Alt sınıf abstract metodu uygulamazsa ne olur?
- PHP fatal error verir, sınıf kullanılamaz
- Alt sınıf otomatik olarak abstract olur ama yine de new ile örneklenir
- Metot varsayılan değer döndürür
- Hiçbir şey olmaz, program normal çalışır
Cevabı göster
PHP fatal error verir, sınıf kullanılamaz — Doğru. Alt sınıf abstract metodu uygulamazsa PHP fatal error verir; new ile örneklenemez.
-
Soyut sınıfı miras al
class Circle ____ Shape {
public function area(): float {
return 3.14;
}
}
Cevabı göster
class Circle extends Shape {
public function area(): float {
return 3.14;
}
}
-
Soyut sınıf mirasını eşleştir
- extends Shape
- Soyut sınıfı miras alır
- abstract method
- Alt sınıfta uygulanmalı
- iki alt sınıf
- İki farklı uygulama
- describe()
- Somut metot, mirasla gelir
Sıradaki ders: Template method deseni