C # 'da sanal ve soyut yöntemleri keşfetmek

C # programlama dili, her birinin kendine özgü avantajları olan hem sanal hem de soyut yöntemler için destek sağlar. Geç bağlamayı uygulamak için sanal yöntemler kullanırsınız, oysa soyut yöntemler, türün alt sınıflarını yöntemin açıkça geçersiz kılınmasını sağlamanıza olanak tanır. Bu yazıda hem sanal hem de soyut yöntemler ve ne zaman kullanılması gerektiği üzerine bir tartışma sunacağım.

Sanal yöntem, temel sınıfta sanal olarak bildirilen bir yöntemdir. Bir yöntem, yöntem imzasında "virtual" anahtar sözcüğü belirtilerek sanal olarak bildirilir. Sanal bir yöntemin bir dönüş türü olabilir veya olmayabilir. Sanal yöntemler, türün alt sınıflarının yöntemi geçersiz kılmasına izin verir. Çalışma zamanı polimorfizmini veya geç bağlanmayı uygulamak için kullanılırlar. Bir sınıfın sanal veya soyut üyelerinin özel olarak ilan edilemeyeceği unutulmamalıdır. Ayrıca, sanal bir yöntemde bir uygulamaya sahip olabilirsiniz, yani sanal yöntemlerin içlerinde uygulamaları olabilir. Bu uygulamalar, sanal yöntemin tanımlandığı türün alt sınıfları tarafından geçersiz kılınabilir.

MSDN şunu belirtir: "Sanal anahtar sözcük, bir yöntemi, özelliği, dizin oluşturucuyu veya olay bildirimini değiştirmek ve türetilmiş bir sınıfta geçersiz kılınmasına izin vermek için kullanılır."

Şimdi sanal yöntemlerin nasıl kullanıldığına dair daha iyi bir netlik için bazı kodlara bakalım. Aşağıdaki kod parçacığına bakın.

public class Base

{

public virtual void Test()

{

Console.WriteLine("This is the base version of the virtual method");

}

}

public class Derived : Base

{

public override void Test()

{

Console.WriteLine("This is the derived version of the virtual method");

}

}

Test () yöntemi Base sınıfında sanal olarak bildirilir ve Derived sınıfında geçersiz kılınır. Yöntemi Base sınıfında sanal olarak bildirmek için virtual anahtar sözcüğünün nasıl kullanıldığına dikkat edin. Derived sınıfında sanal yöntemi geçersiz kıldığınızda virtual anahtar sözcüğü gerekli değildir.

Şimdi, sanal yöntemlerin nasıl çağrıldığını gösteren, aşağıda verilen kod parçacığına bakın.

class Program

{

static void Main()

{

Base baseObj1 = new Base();

baseObj1.Test();

Base baseObj2 = new Derived();

baseObj2.Test();

}

}

Base sınıfının iki örneğinin oluşturulduğunu unutmayın - baseObj1 ve baseObj2. İlk durumda, baseObj1 adlı başvuru nesnesi, Base sınıfının bir örneğini ifade eder. İkinci durumda, baseObj2 adlı başvuru nesnesi, Derived sınıfının bir örneğini ifade eder. Kodu çalıştırdığınızda, sanal yönteme yapılan ilk çağrı konsolda "Bu, sanal yöntemin temel sürümüdür" mesajını görüntüler. İkinci durumda, "Bu, sanal yöntemin türetilmiş sürümüdür" mesajı görüntülenir. Neden bu fark?

İlk durumda, baseObj1 referans nesnesinin türü dikkate alınır - Base türünde olduğu için sanal yöntemin temel sürümü çağrılır. İkinci durumda, baseObj2 referans nesnesinin bağlamı ve dolayısıyla sonuç dikkate alınacaktır.

Abstract methods are those that are declared abstract in the base class and cannot have implementations in them, i.e., they cannot have any functionality in them. You can use abstract methods when you would like the method to be overridden forcefully in the derived classes of the type in which the abstract method has been defined. This is enforced at compile time by the compiler. So, if you have declared a method as abstract using the abstract modifier in a base class, the subclasses of this class would have to implement the abstract method failing which the compiler would display an error stating that the derived class hasn't implemented the abstract member. In essence, an abstract method is declared using the abstract keyword in an abstract base class and non-abstract subclasses of this type have to have their own implementation of the abstract method. Abstract methods are also implicitly virtual in nature but you cannot use the virtual keyword when declaring an abstract method. It should be noted that abstract methods can only be declared inside abstract classes.

Soyut bir yöntemin tipik bir kullanımı, ToString () veya Equals () yöntemlerinin geçersiz kılınmasını zorlamaktır. Aşağıdaki kod parçacığı, soyut yöntemlerin EntityBase adlı soyut bir sınıfta nasıl bildirildiğini gösterir.

public abstract class EntityBase

{

public abstract override string ToString();

public abstract override bool Equals(object obj);

}

public class Customer : EntityBase

{

//Implementation code for the abstract methods

}

EntityBase sınıfı, tüm varlıklar için temel türdür - Müşteri varlık sınıfı bu sınıfı genişletir ve soyut yöntemler için uygulama sağlar. Temelde, tüm varlık sınıfları, ToString () ve Equals () yöntemlerinin kendi uygulamasını sağlar. Temel sınıfta bu yöntemler için varsayılan uygulama gerekmez ve bu nedenle soyut olarak işaretlenirler. Dolayısıyla, yöntemi geçersiz kılma, yöntemi EntityBase adlı temel sınıfta soyut olarak bildirerek uygulanır.