Menu
Coddy logo textTech

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ı:

15

Shape 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.

challenge icon

Görev

Kolay

Farklı 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 bir Media sı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ı gereken play() adlı soyut bir metot ekleyin. Ayrıca başlığı döndüren normal bir getTitle() metodu ekleyin. Bu somut metot tüm alt sınıflar tarafından miras alınacaktır.
  • Song.php: Media sınıfını genişleten bir Song sı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çin parent::__construct() kullanın, ardından sanatçıyı kendiniz ayarlayın. Gerekli play() metodunu, "Playing song: [title] by [artist]" döndürecek şekilde uygulayın.
  • Podcast.php: Media sınıfını genişleten bir Podcast sı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çin parent::__construct() kullanın, ardından bölümü ayarlayın. Gerekli play() 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

?>
quiz iconKendini test et

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

Kendi başına pratik yap: Online PHP derleyicisi