20 Kasım 2017 Pazartesi

C#'ta Kalıtım (Inheritance) - Kalıtımda Sanal Metotlar, Overriding ve Bazı Hususlar - Part 4

Merhaba,

Bir önceki yazıda Kalıtımda Yapılandırıcılar ve Ad Gizlemeden bahsetmiştik. Bu yazıda ise kalıtımda metotlara daha yakından bir bakış atacağız.

Bir sınıf, başka bir sınıfın üyelerini miras alabildiği gibi public metotları da miras alabilir. Fakat bazı durumlarda bu metotların türetilmiş sınıfa ait specific özellikler yerine getirmesi istenebilir. Bu durumda metot adını değiştirip yeni bir metot yazmak mantıklı gelse de, OOP açısından zayıf bir yöntem olacaktır. Bunun yerine temel sınıftan alınan bir metodu özelleştirmek için temel sınıfta sanal metot (virtual) tanımlayıp türetilmiş sınıfta bu metodu devre dışı bırakmak (overriding) gerekir. Bu durumda artık temel sınıftan kalıtım ile gelen metot devre dışı kalacak olup türetilmiş sınıftaki metot geçerli olacaktır. OOP'un çok biçimlilik (polymorphism) özelliği bunu gerektirir. OOP'un nimetlerinden mümkün olduğunca yararlanmak, boyutu büyüyen projeler için daha sağlıklı olacaktır.

Aşağıdaki örneği inceleyelim:

class A
    {
        public virtual void MyVirtualMethod() {
            Console.WriteLine("Bu temel sınıfın sanal metodu");
        }
    }
    
    class B : A {
        public override void MyVirtualMethod()
        {
            Console.WriteLine("Bu da B'nin override ettiği metod");
        }
    }
static void Main(string[] args)
        {
            A a = new A();
            a.MyVirtualMethod();
            B b = new B();
            b.MyVirtualMethod();
}

Bu programın çıktısı aşağıdaki gibi olur:

Bu temel sınıfın sanal metodu
Bu da B'nin override ettiği metod

Öncelikle; A'da bir sanal metot (public virtual) tanımlandığına dikkat edin. Bu metot A sınıfında belli bir işi yerine getirmekte. Fakat B, ekstra işler daha yapmak istemektedir. Bu durumda A'nın metodunu devre dışı bırakıp (public override) kendi işini yapabilmektedir. Eğer; B sınıfı A sınıfındaki metodun da yaptığı işleri yapmak isterse ama ayrıca kendi işini de ilave etmek isterse yine A'daki metodu base anahtar sözcüğü ile çağırabilir. Yukarda B'nin içindeki metot aşağıdaki gibi olabilir:

 class B : A
    {
        public override void MyVirtualMethod()
        {
            base.MyVirtualMethod();
            Console.WriteLine("Bu da B'nin override ettiği metod");
        }
    }

Bu durumda, A'nın metodunun yaptığı işlere ilaveten kendi işlerini de yapabilecektir.

Sanal metotların devre dışı bırakılma gibi bir zorunluluğu yoktur. Devre dışı bırakılmazsa temel sınıftan olduğu gibi devralınabilir.

Sanal metotlar çok yerde işe yarar. Bunun için güzel örneklerden biri de; iki boyutlu şekil sınıfından türeyen üçgen, kare ve dikdörtgen sınıflarının kendi AlanHesapla() metotlarının olabilmesidir. Her geometrik şeklin alan hesaplaması farklı olacağından her bir alt sınıf bu metodu override ederek uygulayacaktır.

Ufak bir not: sanal metotlar public olmak zorundadır. private, abstract ya da static olamazlar. 


Kalıtıma Dair Diğer Hususlar

Daha önce abstract classlar ve metotlardan bu linkte bahsetmiştik. Detaylar için bu linke bakabilirsiniz. Kısaca bahsetmek gerekirse; abstract classlar mutlaka kalıtım yoluyla aktarılabilen özet classlardır. abstract classlar bir nevi yarım classlardır tam bir iş tanımlamamaktadır. Dolayısıyla new anahtar sözcüğüyle oluşturulamazlar. Bir işi yapabilen metotlara sahip olabilmekle birlikte, abstract metotlara da sahip olabilmektedir. Abstract metotlar, abstract classları devralan sınıflarda mutlaka uygulanmak zorundadır.

abstract classlar mutlaka kalıtım ile kullanılabilmelerine karşın, kalıtımı önleyen sealed yapısı da mevcuttur. Bir sınıf neden kalıtım ile aktarılamasın ki buna ne gerek var diye düşünebilirsiniz. Bazı özel durumlarda bu işe yarar. Örneğin; tıbbi, elektronik vb gibi bir cihazınızın ilk kullanıma hazırlanmasını ayarlayan bir sınıfınız olsun. Böylece bunu kullanan kullanıcıların bu ilk hazırlanma şeklini değiştirebilmelerini istemeyebilirsiniz. Bu durumda sealed yapısını kullanmak işinizi görecektir.

sealed class A {........}

class B : A {......} //Hata!!! A sınıfından sınıf türetemezsiniz.


Bu yazıda kalıtım konusunu noktalıyorum.

Faydalı olabildiysem ne mutlu bana.. Anlaşılmayan bir şey olursa yorum kısmına yazabilirsiniz. Dilim döndüğünce anlatmaya çalışırım.

Bir sonraki yazıda buluşuncaya dek sağlıcaklakalın...
Paylaş:

1 yorum:

  1. Borgata Hotel Casino & Spa Announces Launch Of Mohegan Sun
    Borgata Hotel Casino 충청남도 출장마사지 & 안동 출장샵 Spa announced a retail location and mobile application to begin integrating the 포천 출장샵 two new 평택 출장마사지 gaming 김해 출장마사지 resorts

    YanıtlaSil

Bu Blogda Ara