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 (abstract class), doğrudan örneği oluşturulamayan bir sınıftır. Diğer sınıflar için bir taslak görevi görür ve alt sınıfların uygulaması gereken yöntemleri tanımlar. Bir soyut sınıfı abstract anahtar kelimesini kullanarak oluşturursunuz.

<?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 miras aldığı getColor() gibi normal yöntemler de içerebileceğine dikkat edin.

Soyut metotlar, bir alt sınıfın ne yapması gerektiğini tanımlar, ancak nasıl yapacağını tanımlamaz. Bu, her şeklin alanını farklı şekilde hesaplamasına izin verirken tüm şekillerin bir calculateArea() metoduna sahip olmasını sağlar.

Önemli Nokta: Soyut sınıflar (Abstract classes), kalıtım yapısını zorunlu gereksinimlerle birleştirir. İlgili sınıflar arasında kod paylaşmak ve aynı zamanda belirli metotların her bir alt sınıf tarafından uygulanmasını sağlamak istediğinizde bunları kullanın.

challenge icon

Görev

Kolay

Soyut sınıfların bir sözleşmeyi nasıl zorunlu kıldığını ve farklı medya türlerinin kendi oynatma davranışlarını uygulamalarına nasıl izin verdiğini gösteren bir medya oynatıcı sistemi oluşturalım.

Kodunuzu üç dosya halinde düzenleyeceksiniz:

  • Media.php — Tüm medya türleri için taslak görevi gören soyut bir Media sınıfı tanımlayın. Korumalı (protected) bir $title özelliğine ve başlığı kabul edip ayarlayan bir yapıcıya (constructor) sahip olmalıdır. Alt sınıfların uygulaması gereken play() adında 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.phpMedia sınıfını genişleten bir Song sınıfı tanımlayın. Media dosyasını en üste dahil edin. Bu sınıf bir $artist özelliği ekler. Yapıcı, başlık 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.phpMedia sınıfını genişleten bir Podcast sınıfı tanımlayın. Media dosyasını en üste dahil edin. Bu sınıf bir $episode özelliği (bir tam sayı) ekler. Yapıcı, başlık 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 dosyasında hem Song hem de Podcast dosyalarını dahil edin. Dört girdi alacaksınız: şarkı başlığı, sanatçı adı, podcast başlığı ve bölüm numarası (tam sayıya dönüştürülecek bir dize olarak). Bu değerlerle bir Song ve bir Podcast nesnesi oluşturun. Önce şarkı üzerinde, ardından podcast üzerinde play() metodunu çağırmanın sonucunu, her biri kendi satırında olacak şekilde yazdırın.

Bu meydan okuma, soyut sınıfların bir sözleşmeyi nasıl tanımladığını gösterir — her medya türünün bir play() metodu 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 paylaşılan işlevsellik sağlamak için vardır.

Kopya kağıdı

Soyut (abstract) bir sınıf, doğrudan örneği oluşturulamayan bir sınıftır. Diğer sınıflar için bir taslak görevi görür ve alt sınıfların uygulaması gereken yöntemleri tanımlar. Soyut bir sınıf oluşturmak için abstract anahtar kelimesini kullanın.

abstract class Shape {
    protected $color;
    
    public function __construct($color) {
        $this->color = $color;
    }
    
    abstract public function calculateArea();
    
    public function getColor() {
        return $this->color;
    }
}

Alt sınıflar tüm soyut yöntemleri uygulamalıdır:

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;
    }
}

Temel özellikler:

  • Soyut sınıfların doğrudan örneği oluşturulamaz
  • Soyut yöntemlerin soyut sınıf içinde bir uygulaması yoktur
  • Alt sınıflar tüm soyut yöntemleri uygulamalıdır
  • Soyut sınıflar hem soyut hem de normal yöntemler içerebilir
  • Soyut sınıflardaki normal yöntemler alt sınıflar tarafından miras alını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)));

// YAPILACAK: songTitle ve artistName ile bir Song nesnesi oluşturun

// YAPILACAK: podcastTitle ve episodeNumber ile bir Podcast nesnesi oluşturun

// YAPILACAK: Şarkı üzerinde play() çağırma sonucunu yazdırın

// YAPILACAK: Podcast üzerinde play() çağırma sonucunu yazdırın

?>
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