Arayüz ve Soyut Sınıf Karşılaştırması
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 30 / 91.
Artık hem arayüzleri hem de soyut sınıfları öğrendiğine göre, her birini ne zaman kullanacağını açıklığa kavuşturalım. Benzer görünseler de farklı amaçlara hizmet eder ve farklı yeteneklere sahiptirler.
| Özellik | Arayüz | Soyut Sınıf |
|---|---|---|
| Metotlar | Yalnızca metot imzaları | Hem soyut hem de somut metotlar |
| Özellikler | Yalnızca sabitler | Özelliklere sahip olabilir |
| Çoklu kalıtım | Bir sınıf birden çok arayüzü uygulayabilir | Bir sınıf yalnızca bir sınıfı genişletebilir |
| Yapıcı | Bir __construct imzası bildirebilir (gövde yok) | Gövdeye sahip bir yapıcı tanımlayabilir |
İlişkili olmayan sınıfların yerine getirebileceği bir sözleşme tanımlamak istediğinde arayüz kullan. Örneğin, ortak bir üst sınıfı olmamasına rağmen hem bir Printer hem de bir Logger, Writable arayüzünü uygulayabilir.
Ortak kodu paylaşan ilişkili sınıflarınız olduğunda soyut sınıf kullanın. Dog ve Cat sınıflarınızın her ikisinin de aynı eat() yöntem uygulamasına ihtiyacı varsa, soyut bir Animal sınıfı bu kodu bir kez yazmanıza olanak tanır.
Her iki yaklaşımı da birleştirebilirsiniz. Bir sınıf, birden çok arayüzü uygularken soyut bir sınıfı genişletebilir:
<?php
abstract class Animal {
protected $name;
public function eat() {
return $this->name . " is eating";
}
}
interface Swimmable {
public function swim();
}
class Duck extends Animal implements Swimmable {
public function __construct($name) {
$this->name = $name;
}
public function swim() {
return $this->name . " is swimming";
}
}
Önemli Nokta: Birbiriyle ilişkili olmayan sınıflar arasında yetenekleri tanımlamak için arayüzleri seçin. İlişkili sınıflar arasında kod paylaşmanız gerektiğinde soyut sınıfları seçin.
Görev
KolayKalıtım yerine soyut sınıfın ne zaman kullanılacağını ve bir arayüzle nasıl etkili bir şekilde birleştirileceğini gösteren bir araç sistemi oluşturalım.
Araçların kalıtım yoluyla ortak özellikleri paylaştığı, ancak arayüzler aracılığıyla ek yetenekler de kazanabildiği bir sistem oluşturacaksın. Bu, gerçek dünyadaki tasarım kararlarını yansıtır: bir araba bir araçtır (kalıtım), ancak aynı zamanda yakıt ikmali yapılabilir olma yeteneğine de sahiptir (arayüz).
Kodunu dört dosya arasında düzenle:
Refuelable.php: Tek bir metot imzasına sahip birRefuelablearayüzü tanımla:refuel($amount). Bu yetenek, kalıtım hiyerarşisinden bağımsız olarak yakıt ikmali gerektiren herhangi bir sınıfa uygulanabilir.Vehicle.php: Tüm araçlar için ortak işlevsellik sağlayan soyut birVehiclesınıfı tanımla. Korumalı bir$brandözelliğine ve başlangıç değeri 0 olan korumalı bir$fuelLevelözelliğine sahip olmalı. Yapıcı metot marka adını kabul etmelidir. Markayı döndüren somut birgetBrand()metodu, mevcut yakıt seviyesini döndüren somut birgetFuelLevel()metodu ve alt sınıfların uygulaması gereken soyut birdrive()metodu ekle.Car.php:Vehiclesınıfını genişleten veRefuelablearayüzünü uygulayan birCarsınıfı oluştur. Gerekli iki dosyayı en üstte dahil et. Yapıcı metot marka adını kabul etmeli ve bu adı üst sınıfın yapıcı metoduna iletmelidir.drive()metodunu,"[brand] car is driving"döndürecek şekilde uygula.refuel($amount)metodunu, miktarı yakıt seviyesine ekleyecek ve"[brand] refueled to [fuelLevel] liters"döndürecek şekilde uygula.main.php: Car dosyasını dahil et. İki girdi alacaksın: bir marka adı ve bir yakıt miktarı (tam sayıya dönüştür). Marka adıyla birCaroluştur. İlk satırdadrive()sonucunu, ikinci satırda ise yakıt miktarıyla birlikterefuel()sonucunu yazdır.
Bu görev temel ayrımı gösterir: soyut Vehicle sınıfı kodu paylaşır ve bir "bir türüdür" ilişkisi kurar; Refuelable arayüzü ise araç olmaları gerekmeksizin diğer ilgisiz sınıflara (örneğin bir jeneratör veya tekne) uygulanabilecek bir yetenek ekler.
Kendin dene
<?php
require_once 'Car.php';
// Girdiyi oku
$brand = trim(fgets(STDIN));
$fuelAmount = intval(trim(fgets(STDIN)));
// TODO: brand ile bir Car oluştur
// TODO: drive() sonucunu ilk satıra yazdır
// TODO: yakıt miktarı ile refuel() sonucunu ikinci satıra yazdır
?>Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesneler$this Anahtar SözcüğüMetotlarÖzelliklerYapıcı (__construct)Yıkıcı (__destruct)Tekrar - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımparent:: Anahtar SözcüğüMetot Geçersiz Kılmafinal Anahtar SözcüğüSoyut SınıflarTekrar - Çalışan Hiyerarşisi7Kapsülleme
Public, Protected, PrivateErişim Belirleyicileri DerinlemesineGetter ve Setter'larBilgi GizlemeYapıcı Özellik Terfisi (8.0)Tekrar - Öğrenci Kayıt Sistemi10İleri Düzey OOP Kavramları
Composition ve KalıtımBağımlılık EnjeksiyonuAnonim SınıflarEnum'lar (PHP 8.1)Fiber'lar (PHP 8.1)Nesne Klonlamaya Derinlemesine BakışÜreteçler ve Yineleyiciler13Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpDepo Kalıbı2Namespace’ler ve Autoloading
Namespace’lere Girişuse Anahtar SözcüğüPSR-4 Autoloading StandardıComposer AutoloaderTekrar - Düzenli Proje5Arayüzler ve Sözleşmeler
Arayüzlere GirişArayüzleri UygulamaBirden Çok Arayüz UygulamaArayüz ve Soyut Sınıf KarşılaştırmasıArayüzlerle Tür İpuçlarıTekrar - Şekil Hesaplayıcı8Sihirli Metotlar
Sihirli Metotlara Giriş__toString ve __debugInfo__get, __set, __isset, __unset__call ve __callStatic__clone ve Nesne Klonlama__serialize ve __unserializeTekrar - Özel Koleksiyon3Sınıf Özellikleri
Örnek ve Statik ÖzelliklerSınıflarda SabitlerStatik Metotlar ve ÖzelliklerPrivate ve Protected ÖzelliklerSalt Okunur Özellikler (PHP 8.1)Tekrar - Banka Hesabı Yöneticisi6Çok Biçimlilik
Metot Geçersiz Kılmayı Yeniden Ele AlmaArayüzler Yoluyla Çok BiçimlilikTür İpuçları ve Birleşim TürleriGeç Bağlanan Statik ÇağrılarÖzet - Ödeme İşlemcisi9Trait'ler
Trait'lere GirişBirden Çok Trait KullanımıTrait Çakışmalarını ÇözümlemeTrait'lerde Soyut MetotlarTrait'ler ve Kalıtım Karşılaştırması12Tasarım Desenleri 1. Bölüm
Tasarım Desenlerine GirişSingleton DeseniFactory DeseniObserver DeseniStrategy DeseniKendi başına pratik yap: Online PHP derleyicisi