New, Virtual, Override Metotları

new metodu, override metodu, virtual metodu

New Metodu

Programcının çok zorlandığı durumlardan bir tanesi de sınıflara ve sınıfların üyelerine benzersiz ve anlamlı adlar bulmaktır. Eninde sonunda sınıf hiyerarşisi içerisinde temel sınıfa ait bir metodun adı türemiş sınıfta kullanılacaktır. Örneğin;

class Insan
    {
        // Temel sınıf üyeleri
        public double Boy, Kilo;
        public string Ad;

        public Insan(string ad) // Temel sınıf için kurucu metot
        {
            this.Ad = ad;
            this.Boy = 0.45;
            this.Kilo = 3.5;
        }

        public void Buyut()
        {
            Boy += 0.5;
            Kilo += 0.5;
        }
    }

    class Ogrenci : Insan
    {
        // Türetilmiş sınıf üyeleri
        public Ogrenci(string Ad)
            :base(ad) // Insan(ad) temel sınıf kurucu metodunu çağırır.
        {

        }

        new public void Buyu()
        {
            this.Boy += 1.5;
            this.Kilo += 1.5;
        }
        public void Oku()
        {
            // Oku metodu kodları
        }
    }

Insan temel sınıfında yer alan Buyu metodu Ogrenci türemiş sınıfında da kullanılmaktadır. Derleyici bu durumda Insan sınıfındaki Buyu metodunun gizlendiğini belirten bi uyarı görüntüler. Bu uyarı aynı zamanda “new” anahtar sözcüğünü kullanarak bu uyarının kaldırılabileceğini de belirtir. İşte türemiş Ogrenci sınıfındaki Buyu metodunun başında “new” sözcüğünü kullanma nedeni budur. Burada derleyiciye bilinçli olarak temel sınıftaki Buyu metodunun gizlendiği bildirilmiş olunuyor.

Virtual (Sanal) Metodu

Temel sınıfa ait bir metodun bazen türemiş sınıfta farklı bir şekilde kullanılması gerekebilir. Bu durumda temel sınıfın söz konusu metodu türemiş sınıfın değiştirip kullanılabileceği sonucu verilmektedir. Bu izin, metodun temel sınıfta “virtual” olarak tanımlanması sonucu verilmektedir. Diğer bir ifadeyle temel sınıfta “virtual” olarak tanımlanmış bir metodun türemiş sınıfta yeniden yazılabileceği belirtilmiş olunuyor. Örneğin;

public class Sekil
    {
        public const double PI = Math.PI;
        protected double x, y;
        
        public Sekil()
        {

        }
        public Sekil(double x, double y)
        {
            this.x = x;
            this.y = y;
        }

        public virtual double Alan()
        {
            return x * y;
        }
    }

Sekil sınıfına ait Alan adında bir metot olsun. Örnekte Alan metodunun “virtual” tanımlandığına dikkat edilmelidir. Sekil sınıfından türeyecek diğer sınıflar içerisinde Alan metodunun değiştirilerek yeniden yazılmasına burada izin verilmiş bulunuluyor.

Override (Geçersiz Kılma) Metodu

Temel sınıfta “virtual” tanımlanmış bir metodun türemiş sınıfta yeniden yazılması için (geçersiz kılma) “override” sözcüğü kullanılır. Temel sınıfta “virtual” tanımlanmamış ya da “static” tanımlanmış olan üyeler (metot, özellik, dizinleyici ya da olay) türemiş sınıfta yeniden yazılamaz (Geçersiz kılınamaz.). Virtual metodunda verilen örnek şu şekilde genişletilebilir;

public class Daire : Sekil
    {
        public Daire(double r)
            :base(r, 0)
        {

        }

        public override double Alan()
        {
            return PI * x * x;
        }
    }

class Kure : Sekil
    {
        public Kure(double r)
            :base(r, 0)
        {

        }

        public override double Alan()
        {
            return 4 * PI * x * x;
        }
    }

class Silindir : Sekil
    {
        public Silindir(double r, double h)
            :base(r, h)
        {

        }

        public override double Alan()
        {
            return 2 * PI * x * x + 2 * PI *x * y;
        }
    }

Bu örnekte Daire, Kure ve Silindir sınıfları Sekil temel sınıfından türetilmişlerdir. Hepsinde de Sekil sınıfında “virtual” tanımlanan Alan metodu yeniden yazılmıştır. Bu yeniden yazma (geçersiz kılma) esnasında “override” sözcüğünün kullanıldığına dikkat ediniz. Ayrıca burada dikkat edilmesi gereken nokta “virtual” ve “override” metotların imzalarının (dönüş türleri ile birlikte parametrelerinin tür ve sayıları) aynı olması gerekliliğidir.

Ayrıca temel sınıfta “virtual“, “abstract” ya da “override” olarak tanımlanmış metotlar türemiş sınıfta geçersiz kılınabilir.

Bir diğer önemli nokta da “override” metotlar “new“, “static” ya da “virtual” sözcükleri ile tanımlanamaz.

Son olarak “virtual” metodun erişim belirteci “override” sırasında değiştirilemez. Yani temel sınıfta metot “public” ise türemiş sınıfta da “public“, “protected” ise “protected” kalmalıdır.

Bir Cevap Yazın

This site uses Akismet to reduce spam. Learn how your comment data is processed.