Yazarlar Sözlük Makaleler Yardım Masası Gözlük Forum İstatistik

Tüm Başlıklar XML

1.  classlar icinde virtual keyword'u ile tanimlanan fonksiyonlardir. override edebilebilme ozelligi vardir bu fonksiyonlarin. virtual keyword'u kullanilmadan yazilan fonksiyonlari ise C# dilinde new operator'unu kullanarak yeniden yazabiliriz, override edemeyiz.

Virtual metodlar dillere gore asagidaki gibi tanimlanir.

C#:
virtual int IleriGit();

Delphi:
function IleriGit(): int;virtual;

VB:
overridable function IleriGit()

bateristt
23 Mayıs 2005 09:13
2.  Hem polimorphism hem de inheritance nimetlerinden faydalanmaya imkan veren OOP kavramı.

Taban sınıfda virtual olarak tanımladığınız bir metodun içine default kodlarınızı yazarsınız. Türetilmiş sınıflarda isterseniz bu metodu override ederek (tekrar yazıp virtual metodu kullanım dışı bırakarak) farklı biçimde çalışmasını sağlarsınız*, ya da isterseniz türetilmiş sınıfda bu kodu override etmez taban sınıftaki versiyonu kullanırsınız.*

İşte örnek:
public class Personel // bu taban sınıf
{
    public int Id;
    public string Ad;

    public virtual string GetTableName() {
        return "Personel";
    }
    public virtual void Kaydet(){
        db.Exec("insert into " + this.GetTableName() + "(ad) values('" + Ad + "')");
        this.Id = db.GetLastId();
    }
}
public class Mudur : Personel // bu da türetilmiş sınıf
{
    public override string GetTableName() {
        return "Mudur";
    }
}

Örnekte de görüldüğü üzere Personel sınıfında iki virtual method tanımlanmış. Bu sınıftan türetilen Mudur sınıfında ise bu iki metoddan sadece biri (GetTableName) override edilmiş. Şimdi bir factory pattern implementasyonu yapalım, edelim ki bu yaklaşımın faydasını görelim:

public class ObjectFactory
{
    // aslında burada ObjectFactory için singleton pattern
    // uygulamak hoş olurdu. Ama şimdilik boşverelim.
    public static ObjectFactory Instance { get {return new ObjectFactory();} }

    public Personel CreateObject(string name){
        if(name=="Personel")
            return new Personel();
        else
            return new Mudur();
    }
}

public class InsanKaynaklariUygulamasi
{
    public static void Main()
    {
        Personel p1 = ObjectFactory.Instance.CreateObject("Personel");
        Personel p2 = ObjectFactory.Instance.CreateObject("Mudur");

        p1.Kaydet();
        p2.Kaydet();
    }
}

Main() metodunda iki tane Personel oluşturduk, biri müdür, biri normal personel. İkisinin de görünürde tipi Personel. Kaydet() metodunu çağırdığımızda p1 de, p2 de Personel.Kaydet() metodunu çağırır. Ama Kaydet() metodunun içinde p1 için Personel.GetTableName() çağrılırken, p2 için Mudur.GetTableName() çağrılır.

Virtual methodlar sayesinde, böylece, hem ortak kod kullandık*, hem de iki nesnenin farklı biçimlerde davranmasını sağladık.*
fizikci
02 Temmuz 2005 16:18 ~ 19 Ekim 2006 02:46
Bu konuda bildiklerinizi bizlerle paylaşabilirsiniz
Tabi bunun için yazarsanız giriş yapmalı, yazar değilseniz yazar olmalısınız.


Bu başlığa bkz veren girişlerin başlıkları nedir?

Bu başlığa bkz veren girişler başka hangi başlıklara bkz verdiler?
© 2005, Bilişim Kulübü. (1125 ms)
Ne yapabilirsin: SubtitleClick ile İngilizceni Geliştir, Çınar Framework ile kod yaz, Eglencelik.org'ta biraz eğlen