• Şuradasınız
  • Anasayfa
  • PHP
  • PHP : Kalıtım ve Çok Biçimlilik

PHP : Kalıtım ve Çok Biçimlilik

Nesneye yönelik programlamanın, prosedürel programlamadan farklı olarak bazı olanakları veya gereklilikleri vardır. Bunlardan ilkini, yani sarmalamaburadaki yazımda not etmiştim.

Bu yazıda ise nesne türetme, kalıtım, çok biçimlilik ve soyutlama ilkelerinden bahsetmeye çalışacağım.

  • Kalıtım (Miras) ve Nesne türetme
  • Çok biçimlilik ve Soyutlama

Kalıtım ve Nesne türetme

Bir sınıf, eleman sahalardan (değişkenlerden) ve eleman fonksiyonlardan (fonksiyonlardan) oluşmaktadır. Bu sınıf üzerinden başka bir sınıf oluşturarak eski sınıfın değişkenlerini ve fonksiyonlarını kullanabilirsiniz. Sorulması gereken soru ise neden böyle birşeye ihtiyaç duyulduğudur.

Bir sınıf üzerinden bir nesne ürettiğinizde o nesne, sınıfın tüm değişkenlerine ve fonksiyonlarına sahip olacaktır. Fakat bazı durumlarda nesnenin, o sınıfın değişkenlerinin ve fonksiyonlarının haricinde başka değişkenler ve fonksiyonlar içermesini de isteyebiliriz, bazen bu gerekecektir. Böylesi durumlarda temel sınıfı kullanarak bir sınıf türetmek gerekir. Dolayısıyla türettiğiniz sınıftan oluşturduğunuz bir nesne, hem temel sınıfın elemanlarına hem de yeni (türetilmiş) sınıfın elemanlarına sahip olacaktır.

Biraz soyut bir konu olduğu için bir örnek üzerinden gitmek yararlı olabilir.

Bir okulda hem öğrenciler hem de öğretmenler bulunmaktadır. Öğrenciler de öğretmenlerde birer isme ve soyisme sahiptir. Öğrencileri ve öğretmenleri “kisi” sınıfı altında toplamak, benzer eleman sahaları içerecekleri için mantıklı olacaktır. Fakat öğrencilerin bir numarası olmasına karşın öğretmenlerin bir numarası yoktur, ayrıca öğretmenlerin bir branşı olmasına karşın öğrencileri yoktur. Dolayısıyla kisi sınıfı üzerinden, “ogrenci” ve “ogretmen” sınıflarını türetmemiz gerekir.

class kisi {
	protected $ad;
	protected $soyad;
}
class ogrenci extends kisi {
	protected $no;
}
class ogretmen extends kisi {
	protected $ders;
}

Bu sınıf hiyerarşisinde:

ogrenci sınıfından yaratılmış bir nesne; $ad, $soyad, $no elemanlarına sahip olacaktır.

ogretmen sınıfından yaratılmış bir nesne ise $ad, $soyad, $ders elemanlarına sahip olacaktır.

En kısa ifadeyle, türemiş sınıflar, temel sınıfların elemanlarını kalıtım yoluyla edinirler. İnsanlarda da durum böyle değil midir ?

Değişkenlerde olduğu gibi fonksiyonlarda da kalıtım mevcuttur. Temel sınıftaki bir fonksiyon, türetilmiş sınıflardan yaratılan nesneler için de çağrılabilir. Sınıf hiyerarşisini aşağıdaki gibi genişletelim.

/* Temel sınıf */
class kisi {
	protected $ad;
	protected $soyad;
	public function isimBelirle($a) {
		$dizi = explode(" ", $a);
		$this->ad = $dizi[0];
		$this->soyad = $dizi[1];	
	}
	public function isimGoster() {
		echo $this->ad . " " . $this->soyad . "<br/>";
	}
}
/* Türetilmiş sınıf */
class ogrenci extends kisi {
	protected $no;
}
/* Türetilmiş sınıf */
class ogretmen extends kisi {
	protected $ders;
}

Şimdi de ogrenci sınıfını kullanarak bir nesne yaratalım ve o nesne ile temel sınıfın fonksiyonlarını kullanalım.

$ogrenci = new ogrenci();
$ogrenci->isimBelirle("Cem Demir");
$ogrenci->isimGoster();

Temel sınıflar baz alınarak yeni sınıflar türetilir ve yeni sınıflar temel sınıfın özelliklerini edinir ve ayrıca kendi özelliklerini oluşturma imkanı da yaratılmış olur. Kalıtım en basit haliyle budur.

Çok biçimlilik ve Soyutlama

Çok biçimlilik, kalıtımın bir sonraki aşamasıdır. Soyutlama ile yapılır. Burada şu iki soruyu sormak gerekir;

  • Çok biçimliliğe neden gerek duyarız ?
  • Soyutlama nedir ?

Yukarıdaki örnek üzerinden giderek sınıfımızı genişletelim.

“kisi” sınıfı bizim en temel sınıfımız. Çok biçimlilik ile bu sınıfta tanımlanmış bir fonksiyon, bu sınıf üzerinden türetilmiş sınıflar için farklı davranacak şekilde tekrardan düzenlenebilir. Zaten adı üstünde, fonksiyon çok biçimli oluyor ve her sınıfta farklı şekilde davranabiliyor. Sadece adı aynı kalıyor.

Bu işlemi yaparken, her sınıfta farklı davranacak fonksiyona soyut fonksiyon denmektedir. Ve bir sınıfta en az bir soyut fonksiyon bulunuyorsa o sınıfa da soyut sınıf denir. Ayrıca en önemli nokta, soyut sınıftan bir nesne yaratılamayacağıdır.

Soyut sınıflardaki soyut fonksiyonların sadece prototipi belirtilir, gövdeleri yazılmaz. Gövdeleri, türetilen sınıflarda doldurulur fakat prototip hep aynı olmalıdır.

Şimdi “kisi” sınıfını soyutlama ilkelerine göre yenide düzenleyelim ve yeni elemanlar ekleyelim.

abstract class kisi {
	protected $ad;
	protected $soyad;
	protected $unvan; // Yeni eleman saha
	public function isimBelirle($a) {
		$dizi = explode(" ", $a);
		$this->ad = $dizi[0];
		$this->soyad = $dizi[1];	
	}
	public function isimGoster() {
		echo $this->ad . " " . $this->soyad . "<br/>";
	}
	public abstract function unvanBelirle(); // Yeni eleman fonksiyon
}

abstract sıfatıyla, unvanBelirle fonksiyonunu soyut yaptık. Dolayısıyla sadece prototipini belirledik. Soyut fonksiyon içerdiği için “kisi” sınıfını da mecburen soyut yaptık. Yine abstract sıfatını kullandık.

Bu sınıf üzerinden türettiğimiz sınıflara bakalım;

/* ogrenci sınıfı */
class ogrenci extends kisi {
	protected $no;
	public function unvanBelirle() {
		$this->unvan = "Öğrenci";
		return $this->unvan;
	}
}
/* ogretmen sınıfı */
class ogretmen extends kisi {
	protected $ders;
	public function unvanBelirle() {
		$this->unvan = "Öğretmen";
		return $this->unvan;
	}
}

Her iki sınıfta da, temel (soyut) sınıfta prototipini bildirdiğimiz unvanBelirle fonksiyonunun gövdesi farklı çalışacak şekilde yeniden yazılmıştır.

Bu sınıflardan birer nesne üretip, o nesne üzerinden soyut fonksiyonu çağırmayı deneyelim;

/* ogrenci sınıfından bir nesne */
$ogrenci = new ogrenci();
echo $ogrenci->unvanBelirle() . "<br/>";
/* ogretmen sınıfından bir nesne */
$ogretmen = new ogretmen();
echo $ogretmen->unvanBelirle() . "<br/>";

Yani en kısa ifadeyle, temel bir sınıf içerisindeki soyut bildirimli olan fonksiyonlar temel sınıf üzerinden türetilmiş sınıfların içerisinde farklı amaçlara hizmet edecek şekilde tekrar düzenlenerek kullanılabilir. Çok biçimlilik en basit haliyle budur.

Bu yazıda yazılan sınıfa buradan ulaşabilirsiniz.

Benzer Yazılar

Yorumlar

  • Mahir KÖLE , 23 Ocak 2014 - 01:17:02

    Arkadaşım çok güzel bir yazı olmuş. Konu hakkında merak etiğim bilgilere eriştim. Ayrıca yazının belirli yerlerinde altı çizili yazılar falan olsun, bir kitap havası oluşturmuş. Çok teşekkür ederim…

    Cevapla
  • bülent , 09 Mart 2016 - 02:17:10

    Cem, o kadar güzel anlatmışsın ki; bilgisayarla, yazılımla uzaktan yakından ilgisi bulunmayan, bir üniversitenin sözel bölümünden mezun olmuş biri olarak ben bile yazdığını çok iyi anladım. Ellerine, yüreğine, emeklerine sağlık. :))

    Cevapla

Yorum Yazın

Su elementleri kullanabilirsiniz : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Arama
RSS
Beni yukari isinla