Merhaba arkadaşlar, bugün sizlerle paylaşmak istediğim konu C# programlama dili içerisinde bulunan Class ve Interface yapıları ve aralarındaki farklar hakkında olacak. Öncelikle Class(Sınıf) nedir bu konuya değinelim, Class içerisinde metotlar, değişkenler hatta yine sınıf tanımlarının yapılabildiği Object Oriented Programlama dilinin temelini oluşturan bir yapıdır. Aşağıdaki örnekte bir Users adında bir sınıfımız ve içerisinde getter ve setter tanımlı olan iki public değişkenimiz var.

 public class Users {

public string userName {get;set;}

public string userEmail {get;set;}

}

Class yapısı hakkında kısa bir açıklama yaptıktan sonra şimdi Interface(Arayüz) yapısına gelelim, Interface’de Class yapısına benzer bir yapıdadır, en kritik farklarından birisi içerisine metodun sadece tanımı eklenir burası biraz kafa karıştırıcı olabilir ama örnek ile anlaşılacağını düşünüyorum.

 

public Interface IUsers{

User getUsersByName(string name);

User getUsersByEmail(string email);

User getUsersById(int id)

}

Yukarıda ki örnekte görüldüğü gibi Interface tanımı Class tanımına benziyor fakat en önemli özelliklerinden birisi sadece metod tanımlarını içermeleridir. Peki diyeceksiniz ki neden interface kullanmamız gerekiyor? bu sorunun cevabını ancak fazlaca kod yazarak, deneyerek tecrübe ederek verebilirsiniz. Bir proje içerisinde kod yapısı arttıkça ve aynı kodlar kendini tekrarlamaya başlayınca çeşitli çözümler aranır, işte bu yapılar da dili işlevsel kullanmak için bir nevi araçtır. Interface kullanmak geliştirme düzenli sağlar, Domain(Proje iş yapısı) yapısına göre tasarlandıktan sonra ve metod tanımlarını implement edildiği Class içerisinde zorunlu kılar, bu da bir zorunluluk olduğundan daha düzenli bir geliştirmeye zorlar.

Genel olarak birbirlerine göre farkları:

*Interface içerisinde metod tanımlarını barındırırken, Class içerisinde metodun kendisi vardır.

*Abstract class base class olma özelliği taşır ve instance edilemez. Bknz:

*Abstract olmayan class instance edilebilir ve implement de edilebilir.

*Abstract class bir defa implement edilir fakat bir class’a birden fazla Interface implement edilebilir. Bknz-1 , Bknz-2

*Interface içerisine tanımlanan metod implement edildiği Class içerisinde tanımlanmak zorundadır.

Örnek :

 
public class UserService:IUser,IUserLogs
{

} 

Yukarıdaki örnekte IUser ve IUserLogs interface(arayüzleri) UserService class’ına implement edilmiştir. Interface tanımlarken ilk harf olarak I harfini kod zorunlu kılmaz fakat geliştirici kuralları açısından doğru kullanım bu şekildedir. Interface ile ilgili basit bir örnek :

 interface IUser
    {
        void getUsers(string name);
        string getUserEmailById(string id);
    }
    interface IUserLogs
    {
        int getUserEntryCountById(int id);
    }

    class UserService:IUser, IUserLogs
    {
        DBEntities db = new DBEntities();
        public void getUsers(string name)
        {

        }

        public string getUserEmailById(string id)
        {
            return db.tblUsers.Where(x=>x.userID==id).EmailAddress;
        }

        public int getUserEntryCountById(int id)
        {
            return db.tblUserPosts.Where(x=>x.userID==id).Count();
        }
    }

Biraz kafa karıştırıcı olabilir fakat kendiniz pratikler ve örnekler yaparak daha anlamlı yapılar ortaya çıkarabilirsiniz. Bir de vereceğim kavramları da araştırmanızı rica ediyorum. K.I.S.S.(Keep İt Simple Stupid), Single Responsebility, Seperation of Concerns, Inversion of Control bu kavramları araştırdıkça ve okudukça kafanıza daha iyi şeyler oturacağına eminim. Sevgilerle.