Abstract Class vs Interface

November 13, 2008 at 2:23 AMoozturk

  Nesne tabanlı programlama (object oriented programming) yaparken, hazırladığımız classlar için base classlar hazarlarız. Bunu yaparken normal class, abstract class, interface kullanırız. Peki hangisi ne işe yarar, hangisini hangi durumlarda kullanmalı?

  Öncelikle abstract class ve interface için şunu söyleyebiliriz; direk olarak değişken yaratamayız bunlardan. Tamamen tanım amaçlı yazıldıkları için, normal class gibi kullanılamazlar. Haliyle eğer değişkene atayıp (instance) kullanmak istiyorsak taban class'ımızı mutlaka bu seçenekler arasından normal class'ı seçmeliyiz.

   Abstract class ile interface karşılaştırması yapmak istersen öncelikle söyleyebileceğimiz bazı farklar var aralarında. Abstract classlar; abstract metodlar (methods), abstract özellikler (properties) gibi diğer üyeleri de barındırabilirler. (Tıpkı normal classlar gibi). Interfaceler ise; Zaten abstract ya da public kelimelerini kullanmamıza gerek kalmadan, içinde tanımladığımız bütün metodları ve özellikleri public ve abstract olarak taşırlar. Yani başka bir şansımız zaten yoktur. Örnek olarak aşağıdaki koda bakalım.

//Abstarct Class

public abstract class Vehicles {

        private int noOfWheel;

        private string color;

        public abstract string Engine {

            get;

            set;

        }

        public abstract void Accelerator();

      }

      //Interface

public interface Vehicles {

        string Engine {

            get;

            set;

        }

        void Accelerator();

      }

  Gördüğümüz gibi abstract classlarda özellikleri ve diğer üyeleri private olarak da tanımlayabildiğimiz gibi aynı zaman da metodları da implemente de edebiliyoruz. Esasen abstract class için gerçek dünyada kullandığmız varlıklar için daha bir tanımlayıcı bakışa sahip olduklarını ancak interfacelerin çok daha tanımlayıcı amaçla kullanıldıklarını söyleyebiliriz. Varlıklar hakkında konuşabileceğimiz iki temel konu vardır. Birincisi maksat, ikincisi ise uygulamadır. Maksat derken buradaki kasıt; durum ve davranıştır, nasıl göründüğü ya da nasıl çalıştığı değil (belki birazcık bilinebilir ama tam denilemez). Uygulama derken de; uygulanırken ki durumu (yani gerçek durumu) ve davranışıdır.

   Biraz teoriden sıyrılıp, bir örnek üzerinden bakalım konuya.

  Bir CMS düşünelim (Content Management System - İçerik Yönetim Sistemi). İçerik; makale, blog ve eleştiriler olsun. Demek ki bu üç farklı şeyin bir ortak noktası var temel olarak o da üçünün de içerik olması. Icerik bizim tabanımız olacak demek ki. Peki Icerik, normal class mı, abstract class mı yoksa interface mi olmalı? Düşündüğümüz iş mantığı (business logic) çerçevesinden bakınca eğer Icerik uygulamanın temel varlığı olmayacak ve kullanılacak bir nesne olmayacaksa - ki bu örnek bu cümleye uyuyor çünkü bu uygulama da temel varlıklar makale, blog ve eleştirilerdir - ; o zaman normal class yapmamalıdır. Geriye abstract class ve interface kalıyor.

  Bu uygulama da her içeriğin yayınlanabilmesi gerekiyor. Haliyle, Icerik tanımının mutlaka içinde bir "yayınla" komutuna ihtiyacı vardır, bu durumda Icerik tanımını mutlaka abstract class olarak yapmak gerekir. Eğer iş mantığımda her içeriğin varsayılan ortak komutu olmasaydı (yayınla komutu mesela), o zaman abstract class'a gerek kalmazdı ve interface de kullanabilrdim. Bunlar normal class, abstract class ve interface arasında seçim yapılacağı zaman en temel farklar oluyorlar. Ama şu gerçeği unutmamak lazım ki, üzerinde konuştuğumuz şey yazılım ve değişmeyen tekşey zaten değişimin ta kendisi. Mesela eğer Icerik tanımını interface olarak yapsaydım, değişiklik yapmam zorlaşırdı. Icerik de yaptığım her değişikliği aynen, Icerikten türettiğim bütün nesnelere yansıtmak zorunda kalacaktım. Bunun üstesinden Icerik'i abstract class olarak tanımlayarak gelebiliyorum ancak unutmamak gereken bir tek durum dışında; çoklu miras (multiple inheritance). Interface ve abstract classları ayıran bir değer fark da CAN-DO (yapabilir) ve IS-A (böyledir) bağlantılarıdır. Az evvel bahsettiğim gibi interface'i çoklu miras için kullanabiliyoruz. Misal olarak bir de kopyalama davranışı veren "ICopy" adında bir interface'imiz olsun ki bu da genelleştirme ve uzmanlaştırma, özelleştirme durumu için bir IS-A bağlantısıdır. Yani türemiş bütün nesneler kendi kopyalama davranışlarına sahip olmak zorunda kalırlar. Eğer makale tanımı; abstract class olan Icerik'ten ve interface olan ICopy'den türerse bu da makale nesnesinin kopyalama yapabildiğini gösterir ki bu da CAN-DO'dur.

  Biraz teorik olarak biraz pratik desteğiyle konuyu derinlemesine anlatmaya çalıştım. Konuyu toparlamak gerekirse; abstract class, temel kimliği tanımlar. Bence abstract class günü kurtarır ve hızlıca devam edebilmeyi sağlar yani interface bence daha dikkatli kullanım ve yavaşlık getirir, gerektirir. Tabi daha önce de belirttiğim gibi interface'in en büyük avantajı ve abstract class'tan farkı çoklu miras (multiple inheritance)'dır.

  İyi çalışmalar dilerim.

Posted in: .NET | C#

Tags: , , , , , ,

Comments (27) -

I didn't see a hyperlink anywhere but do you sell ad space? I have several sites within the exact same specialized niche and I'd like to add my banner somwhere in your site.

Reply

Hi, i just thought i'd post and let you know your blogs layout is really messed up on the Opera

Reply

I just came across this blog I was I am getting a 404 page not found when trying to access other posts I hope it gets fixed. Thanks

Reply

adding this info to my blog if thats ok dude.

Reply

adding this info to my blog if thats ok dude.

Reply

zbtojypxucwxoso, <a href="http://garniernutrisse.org">garnier nutrisse</a>, hqOpuWiXHyCASxcVPpHk.

Reply

xajzsubuiagrlaz, <a href="http://mattresstopperbuy.com">mattress topper</a>, iRgBLXYvjKRjVDMjsyQt.

Reply

mipxmlzymlmwzvy, <a href="http://stearnsandfoster.org">stearns and foster</a>, VXZyNSlbTDBHODPdvYyx.

Reply

hgcsulgabdtwmcozxhwm, http://honorar.si zaposlitev , tOaMlbslloIBCFxojs. kxoabvjjgbylnrctmcrd, http://crabtreeandevelyn.org crabtree and evelyn , LTySoWEjCoDwrQFynF.

Reply

Great site design!!!! Whattheme did you use?

Reply

Please post some more of this =)

Reply

I like that site layout . How do you make it? It's really good!

Reply

Thanks for posting this. i really enjoyed reading this.

Reply

jfrtyaxgnzgkrcmpev, http://garniernutrisse.org , bNWXQgIHuijchYOdmBno. slyohgwhsabobdypgv, http://ellamoss.org , KcJvSiktfaVlJBgFQQyt.

Reply

echselfwptdlhbflta, http://mattresstopperbuy.com , IRSzpIaRDGkNIGDViihp. ataotuecvgnjyymvxz, http://spaceheaterbuy.com , oSmPjqNYMSQoNqmpXQdU.

Reply

There is obviously a lot to know about this. I really didnt have a clue. Took me time to read all your posts, at least most of them, but I really enjoyed your blog. It proved to be Very helpful to me and I am sure to all the commenters here! It's always nice when you can not only be informed, but also entertained!

Reply


  Nesne tabanlı programlama (object oriented programming) yaparken, hazırladığımız classlar için base classlar hazarlarız.  Bunu yaparken normal class, abstract class, interface kullanırız.  Peki hangisi ne işe yarar, hangisini hangi durumlarda kullanmalı?


  Öncelikle abstract class ve interface için şunu söyleyebiliriz; direk olarak değişken yaratamayız bunlardan.

Reply

How did you make your site look this good. Email me if you get the chance and share your wisdom. I'd appreciate it.

Reply

Just discovered this blog thru Yahoo, what a way to brighten up my week!

Reply

Just discovered this blog through Google, what a pleasant surprise!

Reply

Nice site, good info, great design, added you to my favorites so I can come back when you post again

Reply

How did you make a blog site look this awesome. Email me if you can and share your wisdom. I'd appreciate it!

Reply

Hey, thank you your writing style is amazing. just found your site on bing. come back later for sure Smile

Reply

Good management is the art of making problems so interesting and their solutions so constructive that everyone wants to get to work and deal with them.   -   Paul Hawken

Reply

This is one awesome post. Really Cool.

Reply

This was a really nice site. I found it on google.

Reply

The Simpsons portrait the lampoons of American lifestyle, tv and many elements of human problem.

Reply

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading