2 Kasım 2017 Perşembe

C# Abstract Classlar (Özet Sınıflar) ve Abstract Metotlar (Özet Metotlar)


Merhaba, bu yazıda abstract yapısı ve interface ile arasındaki farkları inceleyeceğiz.

Abstract yapısı kalıtım mimarisinde önemli bir yere sahiptir. Abstract, özet demektir. Abstract classlar ancak kalıtım yoluyla devralınabilirler, new sözcüğü ile oluşturulamazlar. Çünkü barındırdığı abstract metotlar herhangi bir işi yerine getirmemektedir. Sadece metot prototipini tanımlamaktadır. Tanımlanan bu abstract metotların içinin boş olduğundan yola çıkarak abstract classların new sözcüğü ile oluştutulmaması gerektiği anlaşılabilir. Ayrıca abstract classtaki bütün abstract metotlar devralan nesne tarafından uygulanmak zorundadır. Aksi takdirde hata verecektir.

Anlamanız açısından şöyle bir örnekle başlayalım: TwoDimensionalShape adında iki boyutlu şekilleri ifade eden bir nesnemiz olsun.  Bu nesneyi kalıtım yoluyla devralan dikdörtgen, üçgen.. vs gibi şekil nesneleri olsun. Her şeklin mutlaka bir Alan hesaplaması isteniyor olsun. Bu durumda Area() metodunu abstract olarak tanımlarsak devralan classta bu metodu tanımlama zorunluluğu olacak. Her bir şeklin alan hesaplaması farklı olacağından her şekil nesnesi kendi Area() metodunu uygulayacak.

Abstract classların bütün metotları abstract olmak zorunda değildir, aynı zamanda işlevi olan metotlar da barındırabilirler ama abstract metodu olan bir class, abstract olmak zorundadır.

Yukardaki örneği kodlarla anlatan aşağıdaki örneği inceleyelim.

using System; namespace AbstractOrnek { public abstract class TwoDimensionShape { int width, heigth; string name; public int Width { get { return width; } set { width = value; } } public int Heigth { get { return heigth; } set { heigth = value; } } public string Name { get { return name; } set { name = value; } } public TwoDimensionShape(int width, int heigth, string name) { this.Width = width; this.Heigth = heigth; this.Name = name; } public abstract double Area(); public string NotAbstractMethod() { return "Bu bir abstract metot değildir"; } } //Dikdörtgen public class RectangleShape : TwoDimensionShape { public RectangleShape(int width, int heigth, string name) : base(width, heigth, name) { } public override double Area() { return Width * Heigth; } } //Üçgen public class TriangleShape : TwoDimensionShape { public TriangleShape(int width, int heigth, string name) : base(width, heigth, name) { } public override double Area() { return Width * Heigth / 2; } } class Program { static void Main(string[] args) { RectangleShape rectangleShape = new RectangleShape(10, 20, "Dikdörtgen"); Console.WriteLine("Dikdörtgenin alanı: " + rectangleShape.Area()); TriangleShape triangleShape = new TriangleShape(10, 20, "Üçgen"); Console.WriteLine("Üçgenin alanı: " + triangleShape.Area()); Console.WriteLine(triangleShape.NotAbstractMethod()); Console.ReadLine(); } } }

Bu programın çıktısı şu şekilde olacaktır:

Dikdörtgenin alanı: 200
Üçgenin alanı: 100
Bu bir abstract metot değildir

Görüldüğü üzere her şekil kendi Area() metodunu zorunlu olarak uygulamaktadır.

abstract ile interface arasındaki temel fark ise, abstract classlarda herhangi bir işi yapabilen metotlar bulunabiliyorken interface'de bütün metotların içi tamamen boş olmalıdır. interface temelde bir işin nasıl yapılacağını değil de hangi işlerin yapılacağını tanımlar.

Anlaşılmayan bir şey varsa bu yazının altına yorum olarak yazabilirsiniz.

Sağlıcaklakalın...

Paylaş:

0 yorum:

Yorum Gönder

Bu Blogda Ara