OOP – Polimorfizm (Çok Biçimlilik)

Polimorfizm (Polymorphism – Çok biçimlilik), birçok yazılımcı tarafından Object Oriented Programming (OOP)’nin temel ilkeleri arasında yer alan 4 ilkeden birisi olarak kabul edilir.

Peki nedir bu Polimorfizm?

Polimorfizm için en sade: “Bir ana sınıftan (base class’da denilir) türetilmiş sınıflar.” diyebiliriz. Böyle deyince baya bir sade oldu :)

Kod tarafını şimdilik bir köşeye bırakıp gerçek hayattan polimorfizm örneği verelim.

Örneğin ALİ kişisine telefon etmek istiyorsunuz. Nasıl telefon edeceğiniz umrunuzda değil, sadece ALİ ile telefondan iletişime geçmek istiyorsunuz.

Bu telefon; bir cep telefonu, bir telsiz telefonu, bir jetonlu telefon veya evdeki sabit telefon olabilir. Ama amacınız tek! Ali’ye telefon etmek.

Ama her telefon farklı yollar izler…

Misal; cep telefonu önce gsm operatörüne bağlanır, gsm operatörü yeterli kontörünüz var mı ona bakar. Eğer varsa tuşladığınız telefon gerçekten var mı ona bakar. O da varsa hatlar uygun mu, uygunsa aradığınız kişi uygun mu?

Jetonlu telefon ise apayrı çalışır… Jeton atılmış mı ona bakar. Atılmışsa santrale bağlanır, santrale numarayı iletir, numara kontrol edilir vs. vs.

Her telefon farklı mantıkta çalışır. Ama aslında işlevleri aynıdır. İşlevleri sizi tuşladığınız numaraya ulaştırmak. Ama bunlardan biz haberdar değilizdir. Biz sadece ahizeyi kaldırırız numarayı tuşlarız birkaç saniye sonra istediğimiz kişi ile görüşürüz. Arada olup bitenden haberimiz olmaz.

Polimorfizm’de böyledir. Siz metodu çağırırsınız. O arkada belki de onlarca işlem yapar ama siz sadece bir veya birkaç metodla iletişime geçersiniz.

Şimdi gelin koda bakalım:

Java

interface Telefon{
    public String TelefonEt(String TelNo);
}

class CepTelefonu implements Telefon {
    
    private boolean kontorVarMi = true;
    private boolean operatorUygunMu = false;
     
    @Override
    public String TelefonEt(String TelNo){
        if (kontorVarMi){
            if (operatorUygunMu)
                return TelNo + " aranıyor...";
            else
                return "Hatlar yoğun sonra ara.";
        }
             
        else
            return "Kontörünüz yok.";
    }
     
}
 
class JetonluTelefon implements Telefon {
     
    private boolean jetonVarMi = false;
     
    @Override
    public String TelefonEt(String TelNo){
        if (jetonVarMi)
            return TelNo + " aranıyor...";
        else
            return "Jetonunuz yok.";
    }
}
 
class EvTelefonu implements Telefon {
     
    private boolean faturaYatirildiMi = true;
     
    @Override
    public String TelefonEt(String TelNo){
        if(faturaYatirildiMi)
            return TelNo + " aranıyor...";
        else
            return "Faturayı yatırmamışsın. Bir yeri arıyamazsın";
    }
}

public class Polimorfizm{

    public static void main(String[] args){
        CepTelefonu cep = new CepTelefonu();
        JetonluTelefon jeton = new JetonluTelefon();
        EvTelefonu ev = new EvTelefonu();
         
        System.out.println(cep.TelefonEt("+90 123 45 67"));
        System.out.println(jeton.TelefonEt("0 5123 456 78 90"));
        System.out.println(ev.TelefonEt("0 312 123 45 67"));
    }
}

Gördüğünüz gibi sadece TelefonEt metodları ile çalışıyoruz. Ama kendileri içlerinde farklı farklı işlemler gerçekleştiriyor…

Not: PHP’de polimorfizm örneği için lütfen buraya tıklayın.

 
244 Kudos
Don't move
  1. Hocam iyi anlatmışsınız fakat bir yeri merak ettim. Polimorfizm sınıfında oluşturduğunuz nesneler yine kendi referans tipleriyle oluşturulmuş nesneler. Benim bildiğim polimorfizm üst sınıfın referans tipine bir veya birden çok alt sınıf nesnesinin atanabilmesi ile oluyor. Bu sayede çok biçimlilik sağlanabiliyor bilmem yanılıyormuyum.

    • Dediğiniz şekilde de olabilir. Yani bir tane TelefonEt class’ı içine aramayiBaslat diye bir metot koyup, ona CepTelefonu, EvTelefonu vs. referanslarını da pass edebilirsiniz.

Yorum Yap


Not - Bunları KullanabilirsinizHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>