CodeBlanks Logo Icon CodeBlanks

Miras zinciri

PHP kursu · Orta seviye · Ders 17/115

Birden fazla seviyeli miras zinciri kurmayı ve davranış çoğaltmayı öğrenirsin.

Çok seviyeli miras zinciri

Miras alma tek seviyede sınırlı değildir. Bir çocuk sınıfın kendisi de başka bir sınıfın ebeveyni olabilir. Böylece üç veya daha fazla seviyeli bir miras zinciri oluşur.

Örneğin Vehicle, Car ve ElectricCar üç seviyeli bir zincir kurar. ElectricCar, Car'dan; Car da Vehicle'dan miras alır. Her seviye yeni bir yetenek ekler.

Bu yapı, gerçek dünyadaki sınıflandırmayı modellemek için idealdir: bir Tesla hem araç, hem otomobil, hem de elektrikli araçtır.

Geçişli miras

Miras zincirinin önemli bir özelliği geçişli (transitive) olmasıdır. Yani A B'den, B de C'den miras alıyorsa, A otomatik olarak C'den de miras almış olur.

Bu nedenle ElectricCar bir örneği, Vehicle'ın metotlarını doğrudan çağırabilir; aradaki Car seviyesini atlayarak. PHP bu metotları sınıf hiyerarşisinde yukarı doğru arar.

Sınıf tasarımında zincirin her halkası anlamlı olmalı: her seviye, bir öncekine gerçek bir uzantı eklemeli.

Uygulama Vehicle → Car → ElectricCar zinciri kur

Bu derste Vehicle sınıfının info() metodu yalnızca brand döndürüyor. Sen, Car sınıfını Vehicle'dan, ElectricCar sınıfını da Car'dan türet. Car::drive() metodu $this->info() çağırıp sonuna " gidiyor" eklesin. ElectricCar::charge() metodu $this->drive() çağırıp sonuna ", şarj oluyor" eklesin. Tesla marka bir ElectricCar örneği yapıp charge() çıktısını yazdır.

Örnek çözümü göster
Car extends Vehicle, ElectricCar extends Car. drive() metodu $this->info() çağırır; charge() metodu $this->drive() çağırır.
Örnek çözüm:
<?php

class Vehicle {
    public string $brand;

    public function __construct(string $brand) {
        $this->brand = $brand;
    }

    public function info(): string {
        return $this->brand;
    }
}

class Car extends Vehicle {
    public function drive(): string {
        return $this->info() . " gidiyor";
    }
}

class ElectricCar extends Car {
    public function charge(): string {
        return $this->drive() . ", şarj oluyor";
    }
}

$tesla = new ElectricCar("Tesla");
echo $tesla->charge();

Kendini test et

  1. Vehicle → Car → ElectricCar zincirinde ElectricCar, Vehicle'ın bir metodunu çağırabilir mi?

    • Evet, miras geçişlidir
    • Hayır, yalnızca doğrudan ebeveynin metotlarını
    • Yalnızca kendi tanımladığı metotları
    • Sadece protected metotları
    Cevabı göster

    Evet, miras geçişlidir — Doğru; miras geçişlidir. ElectricCar, Vehicle'ın public/protected metotlarını kullanabilir.

  2. Miras zincirini tamamla

    class Car ____ Vehicle {
        // ...
    }
    
    class ElectricCar extends Car {
        // ...
    }
    Cevabı göster
    class Car extends Vehicle {
        // ...
    }
    
    class ElectricCar extends Car {
        // ...
    }
  3. Miras zinciri kavramlarını eşleştir

    Miras zinciri
    Çok seviyeli miras
    Geçişli miras
    A->B->C zinciri
    Vehicle/Car/ElectricCar
    Üç seviyeli örnek
    Zincir tasarımı
    Her seviye ekleme yapar

Orta seviye bölümündeki tüm dersler