Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Kalı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 bir Refuelable arayü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 bir Vehicle sı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 bir getBrand() metodu, mevcut yakıt seviyesini döndüren somut bir getFuelLevel() metodu ve alt sınıfların uygulaması gereken soyut bir drive() metodu ekle.
  • Car.php: Vehicle sınıfını genişleten ve Refuelable arayüzünü uygulayan bir Car sı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 bir Car oluştur. İlk satırda drive() sonucunu, ikinci satırda ise yakıt miktarıyla birlikte refuel() 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
?>
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