Soyut Sınıflar
Coddy'nin PHP Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 25 / 91.
Soyut bir sınıf, doğrudan örneği oluşturulamayan bir sınıftır. Diğer sınıflar için bir şablon görevi görür ve alt sınıfların uygulaması gereken metotları tanımlar. abstract anahtar sözcüğünü kullanarak soyut bir sınıf oluşturursun.
<?php
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}
$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();
Çıktı:
15Shape sınıfı, bir uygulama sağlamadan soyut bir calculateArea() yöntemi bildirir. Shape sınıfını genişleten herhangi bir sınıf bu yöntemi uygulamalıdır. Soyut sınıfların, alt sınıfların doğrudan devraldığı getColor() gibi normal yöntemler de içerebileceğine dikkat edin.
Abstract yöntemler, bir alt sınıfın ne yapması gerektiğini tanımlar, ancak bunu nasıl yapacağını tanımlamaz. Bu, tüm şekillerin bir calculateArea() yöntemine sahip olmasını sağlarken her şeklin alanını farklı şekilde hesaplamasına olanak tanır.
Önemli Nokta: Soyut sınıflar, kalıtımın yapısını zorunlu gereksinimlerle birleştirir. İlgili sınıflar arasında kod paylaşmak ve aynı zamanda belirli yöntemlerin her alt sınıf tarafından uygulanmasını sağlamak istediğinizde bunları kullanın.
Görev
KolayFarklı medya türlerinin kendi oynatma davranışlarını uygulamasına izin verirken soyut sınıfların bir sözleşmeyi nasıl zorunlu kıldığını gösteren bir medya oynatıcı sistemi oluşturalım.
Kodunuzu üç dosyaya ayıracaksınız:
Media.php: Tüm medya türleri için şablon görevi gören soyut birMediasınıfı tanımlayın. Bu sınıf, korumalı bir$titleözelliğine ve başlığı kabul edip ayarlayan bir kurucu metoda sahip olmalıdır. Alt sınıfların uygulaması gerekenplay()adlı soyut bir metot ekleyin. Ayrıca başlığı döndüren normal birgetTitle()metodu ekleyin. Bu somut metot tüm alt sınıflar tarafından miras alınacaktır.Song.php:Mediasınıfını genişleten birSongsınıfı tanımlayın. Media dosyasını en üstte dahil edin. Bu sınıf bir$artistözelliği ekler. Kurucu metot başlığı ve sanatçıyı kabul etmelidir: başlık içinparent::__construct()kullanın, ardından sanatçıyı kendiniz ayarlayın. Gerekliplay()metodunu,"Playing song: [title] by [artist]"döndürecek şekilde uygulayın.Podcast.php:Mediasınıfını genişleten birPodcastsınıfı tanımlayın. Media dosyasını en üstte dahil edin. Bu sınıf bir$episodeözelliği (bir tam sayı) ekler. Kurucu metot başlığı ve bölüm numarasını kabul etmelidir: başlık içinparent::__construct()kullanın, ardından bölümü ayarlayın. Gerekliplay()metodunu,"Playing podcast: [title] - Episode [episode]"döndürecek şekilde uygulayın.
main.php içinde hem Song hem de Podcast dosyalarını dahil edin. Dört girdi alacaksınız: şarkı başlığı, sanatçı adı, podcast başlığı ve bir tam sayıya dönüştürülecek bölüm numarası (string olarak). Bu değerlerle bir Song ve bir Podcast nesnesi oluşturun. Önce şarkı üzerinde, ardından podcast üzerinde play() çağrısının sonucunu yazdırın; her biri kendi satırında olmalıdır.
Bu alıştırma, soyut sınıfların bir sözleşmeyi nasıl tanımladığını gösterir: her medya türü bir play() metoduna sahip olmalıdır, ancak her tür bunu farklı şekilde uygular. Soyut Media sınıfı doğrudan örneklenemez; yalnızca alt sınıflarına yapı ve ortak işlevsellik sağlamak için vardır.
Kendin dene
<?php
require_once 'Song.php';
require_once 'Podcast.php';
// Girdileri oku
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));
// TODO: songTitle ve artistName ile bir Song nesnesi oluştur
// TODO: podcastTitle ve episodeNumber ile bir Podcast nesnesi oluştur
// TODO: song üzerinde play() çağrısının sonucunu yazdır
// TODO: podcast üzerinde play() çağrısının sonucunu 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