May
30
2011

PHP’de Çok Biçimlilik/Polymorphism

Bu gün ele alacağımız Çok biçimlilik/Polymorphism konusu ile, PHP’de NYP yaklaşımı konusunu nihayetlendiriyoruz. Çok biçimlilik(yazının devamında polimorfizm diyeceğiz) kalıtım konusuyla ilintilidir ve bir örneği, nesne arayüzlerini ele aldığımız yazıda geçmiştir.

O örnekte, Bitki tipinde parametre alan Info metoduna, Bitki arayüzünü implement eden sınıf/nesnelerin parametre olarak geçirildiğini, bu nesneler üzerinden de söz konusu arayüzde gövdesiz olarak deklare edilip sınıf/nesneler içinde iptal edilmiş metodlarını çağrılabildiğini görmüştük.

Bunu sağlayan şey, soyut sınıf/nesneler konusunu işlerken de değindiğimiz “birleştirici olma fonksiyonu” idi. Bu birleştiriciliği kalıtım ve onun doğurduğu akrabalık ilişkisine yakından bakarak anlamaya çalışalım.

public function Info(Bitki $bitki){
   echo $bitki->getAdi().", Familyası: ".$bitki->familya()." Gövdesi: ".$bitki->govde()."\n";
}

Kalıtım konusunu ele aldığımız yazıdan hatırlayacağınız üzere kalıtım, bir sınıfın bir başka sınıftan türemesidir. Türemiş sınıf, kendisinden türediği sınıftan özellik ve metodları miras almaktadır ve kalıtım konusunda en önemli kavram, bu miras kavramıdır.

Türemiş sınıf ile türetildiği sınıf arasında miras bağını oluşturan akrabalık vardır, buna “bir ilişkisi” de diyoruz. Türeyen sınıf aynı zamanda bir türetilen sınıftır. Daha önce çokça örneği geçtiği için tekrara düşmemek adına, bir ilişkisini basit bir örnek üzerinden tekrar gösterelim.

class Insan {

	private $dogum_tarihi;
}

class Erkek extends Insan {

	private $boyu;
	private $kilosu;
}

class Kadın extends Insan {

	private $boyu;
	private $kilosu;
}

Insan sınıf/nesnesinden Erkek ve Kadın isminde iki sınıf/nesnenin türediğini görüyoruz. Erkek bir İnsan’dır, Kadın’da bir İnsan’dır.

Kalıtım yoluyla metod ve özelliklerin miras alındığını gözönüne alırsak, türetilen sınıfın kendisinden türediği sınıfın yaptığı her işi yapabileceğini görürüz. Örneğimizden hareketle bu Erkek ve Kadın sınıf/nesnesinin, İnsan sınıf/nesnesinin yaptığı her işi yapabileceği anlamına gelmektedir ve polimorfizm tam da bu noktada karşımıza çıkmaktadır. Ne demiştik, bir ilişkisi sebebi ile Erken aynı zamanda bir İnsan’dır, Kadın’da öyle. İşte polimorfizm ile kastetilen budur.

Bir örnek üzerinden konuya tekrar yakından bakalım.

class Milletvekili {

	public $donem;
	public $secimbolgesi;
	public $pozisyon;

	function __construct($donem, $secimbolgesi, $pozisyon) {
        $this-> donem = $donem;
		$this-> secimbolgesi = $secimbolgesi;
		$this-> pozisyon = $pozisyon;
    }

	function Oturum(){
		return "Meclis oturumuna katıldı...";
	}
}

class Bakan extends Milletvekili {

	function __construct($donem, $secimbolgesi, $pozisyon) {
        parent::__construct($donem, $secimbolgesi, $pozisyon);
    }

	function Oturum(){
		return "Bakanlar kuruluna katıldı...";
	}
}

class Basbakan extends Bakan {

	function __construct($donem, $secimbolgesi, $pozisyon) {
        parent::__construct($donem, $secimbolgesi, $pozisyon);
    }

	function Oturum(){
		return "Bakanlar kuruluna başkanlık yaptı...";
	}
}

class MeclisTV {

	function haberler(Milletvekili $mv){
		echo "Seçim bölgesi ".$mv->secimbolgesi." olan ".$mv->donem." ".$mv->pozisyon
			 ." ".$mv->oturum()."\n";
	}
}

$mv       = new Milletvekili("24. Dönem", "İstanbul", "Milletvekili");
$bakan    = new Bakan("24. Dönem", "İstanbul", "Kültür ve Turizm Bakanı");
$basbakan = new Basbakan("24. Dönem", "İstanbul", "Başbakan");

$tv      = new MeclisTV;
$tv->haberler($mv);
$tv->haberler($bakan);
$tv->haberler($basbakan);

Kodu incelediğimizde, aralarında bir ilişkisi olan Milletvekili, Bakan ve Basbakan sınıf/nesnelerimizi görüyoruz. Bakan sınıf/nesnesi Milletvekili sınıf/nesnesinden türetiliyor, bu Bakan nesnesinin aynı zamanda bir Milletvekili olduğu anlamına geliyor ve Bakan sınıf/nesnesi, Milletvekili sınıf/nesnesine ait özellik ve metodları miras alıyor.

Basbakan sınıf/nesnesi Bakan sınıf/nesnesinden türetiliyor, bu Basbakan nesnesinin aynı zamanda bir Bakan, Bakan sınıf/nesnesi Milletvekili sınıf/nesnesinden türetildiği için de aynı zamanda bir Milletvekili olduğu anlamına geliyor ve Basbakan sınıf/nesnesi, Milletvekili sınıf/nesnesine ait özellik ve metodları miras alıyor.

Elimizdeki Bakan nesnesi aynı zamanda bir Milletvekili ve Başbakan nesnesi aynı zamanda bir Bakan ve Milletvekili, işte polimorfizm :)

Kodumuzda bu çok biçimliliğin bize sağladığı işlevselliği, MeclisTV sınıf/nesnemizin haberler metodunda görüyoruz.

function haberler(Milletvekili $mv){
		echo "Seçim bölgesi ".$mv->secimbolgesi." olan ".$mv->donem." ".$mv->pozisyon
			 ." ".$mv->oturum()."\n";
	}

Milletvekili tipinde parametre alan metodumuzu biz

$tv->haberler($mv);
$tv->haberler($bakan);
$tv->haberler($basbakan);

bu şekilde, yani Bakan ve Basbakan nesnelerini parametre olarak geçirerek çağırabiliyor ve aşağıdaki çıktıyı alabiliyoruz.

Seçim bölgesi İstanbul olan 24. Dönem Milletvekili Meclis oturumuna katıldı…
Seçim bölgesi İstanbul olan 24. Dönem Kültür ve Turizm Bakanı Bakanlar kuruluna katıldı…
Seçim bölgesi İstanbul olan 24. Dönem Başbakan Bakanlar kuruluna başkanlık yaptı…

Neden?

Çünkü Bakan nesnesi aynı zamanda bir Milletvekili’dir, Basbakan nesnesi de aynı zamanda hem Bakan hem Milletvekilidir. Yazının başlangıcında belirttiğim gibi, nesne arayüzlerini incelediğimiz yazıda gördüğümüz Info metodu içinde olan da budur. Kalıtım ile oluşan bir ilişkisi, soyut sınıf/nesneler ile nesne arayüzlerini incelediğimiz yazılarda değindiğimiz “birleştirici olma fonskiyonu”nun da doğurduğu bir sonuçtur.

Yorum yapabilirsiniz..

En son haber ve ücretsiz eğitimlere ulaşmak için üye olabilirsiniz