Interface'ler Aslında Ne İşe Yarar

bahadirarslan tarafından yazılmıştır. 21. Şubat 2009 01:25

Bana hem eğitimler sırasında hem de bireysel olarak o kadar çok soruldu ki sanıyorum bu konuda birşeyler mutlaka yazmam lazım. Interface kavramının ne olduğunu buradaki yazıda anlatmaya çalışmıştım. Ancak buradaki yazı sadece genel olarak interface kavramını anlatıyor ve bir iki örnek ile konu bitiyordu.

Anladığım kadarı yazı biraz eksik kalmış. Çünkü interface'ler sadece eğlence olsun ya da işi uzatsın diye yazılmaz. En önemli özelliği standardizasyondur. Bu konuyu örnekleyerek devam edelim...

 

Örneğin aşağıdaki gibi bir sınıfımız var.

 

public class ToplamaIslemi
    {
        public int IslemYap(int x, int y)
        {
            return x + y;
        }
    }

Bu basit sınıfımızı örnek olarak hazırladığımız Console uygulamasında aşağıdaki gibi çağırıyoruz.

static void Main(string[] args)
        {
            ToplamaIslemi toplama = new ToplamaIslemi();
            int sonuc = toplama.IslemYap(10, 20);
            Console.WriteLine(sonuc.ToString());
        }

Ve sonuç aşağıdaki gibi oluyor.

 

Bu örnekte ben sınıfın içinde IslemYap isimli bir metod olduğunu biliyordum ve doğrudan sınıf örneği üzerinden bu metodu çağırdım. Peki ya benim çağıracağım sınıfın bu metodu içerip içermediğinden emin değilsem? Yani anlatmak istediğim, modüler bir uygulama geliştirdiniz ve geliştirilen modülün çalışabilmesi için bazı metodları ve özellikleri olması gerekiyor ki sizin uygulamanız ile uyumlu çalışabilsin ama bundan nasıl emin olacaksınız ve bu metodlara nasıl erişeceksiniz.

 

Bu durum da interface'ler size büyük kolaylık sağlar. Örneğin şöyle bir interface hazırlayalım.

interface IMatematikselIslem<T>
    {
        T IslemYap(T x, T y);
    }

Generic özelliğine sahip olan bir interface tanımladık, böylece istediğimiz veri türünü kullanabiliriz. Şimdi  Çarpma, Çıkarma ve Bölme işlemleri için birer sınıf yazalım.

public class CarpmaIslemi : IMatematikselIslem<int>
    {
        public int IslemYap(int x, int y)
        {
            return x * y;
        }        
    }
    public class CikarmaIslemi : IMatematikselIslem<int>
    {

        public int IslemYap(int x, int y)
        {
            return x - y;
        }        
    }
    public class BolmeIslemi : IMatematikselIslem<double>
    {
        public double IslemYap(double x, double y)
        {
            if (y == 0.0)
                throw new DivideByZeroException("Bir sayı sıfıra bölünemez");
            else if (x == 0.0)
                return 0.0;
            else
                return x / y;
        }
    }

Görüldüğü üzere generic yapısını kullanmamız bize bölme işleminde kolaylık sağladı. Tekrar Main() metoduna dönecek olursak,

static void Main(string[] args)
        {
            CarpmaIslemi carpmaIslemi = new CarpmaIslemi();
            BolmeIslemi bolmeIslemi = new BolmeIslemi();
            CikarmaIslemi cikarmaIslemi = new CikarmaIslemi();
            ToplamaIslemi toplamaIslemi = new ToplamaIslemi();

            List<object> islemler = new List<object>(); // işlemleri kolleksiyon halinde saklayacağız
            // tek bir satırda işlemleri atmak için AddRange metodunu kullandık, object dizisini de parametre olarak yolladık.
            islemler.AddRange(new object[] {carpmaIslemi, bolmeIslemi, cikarmaIslemi, toplamaIslemi}); 
            foreach (object islem in islemler)
            {
                //generic tür olarak int alan işlemler
                if (islem is IMatematikselIslem<int>)
                {
                    IMatematikselIslem<int> matIslemi = (IMatematikselIslem<int>)islem;
                    int sonuc = matIslemi.IslemYap(10, 20);
                    Console.WriteLine("Islem: "+ islem.GetType() +", Sonucu:" + sonuc.ToString());
                }
                else if (islem is IMatematikselIslem<double>)
                {
                    // double olarak işlem yapacaksak
                    IMatematikselIslem<double> matIslemi = (IMatematikselIslem<double>)islem;
                    double sonuc = matIslemi.IslemYap(10.0, 2.0);
                    Console.WriteLine("Islem: "+ islem.GetType() +", Sonucu:" + sonuc.ToString());
                }
                else
                {
                    Console.WriteLine("Islem: " + islem.GetType() + " çalıştırılamaz.");
                }
            }            
        }

Görüldüğü üzere Main() metodunu baya değiştirdik, aslında yaptığımız şey basit.

 

  1. Öncelikle  tüm işlemler için bir sınıf örneği oluşturduk.
  2. Ardından object türünden generic bir List kolleksiyonu oluşturduk ve tüm sınıf örneklerini içine AddRange metodu ile attık.
  3. Kolleksiyonumuz içinde foreach ile dönmeye başladık.
  4. Her kayıtta önce if (islem is IMatematikselIslem<int>) kontrolü yaptık. is anahtarı kelimesi bir sınıfın verilen arayüzü (interface'i) uygulayıp uygulamadığını belirlemekte kullanılır ve geriye bool değer döndürür. Burada da IMatematikselIslem arayüzünü <int> türü ile uygulayan olup olmadığını kontrol ettik ve Toplama ile Çıkarma işlemlerini bulduk.
  5. İşlemin uygun olduğunu tespit edince
     IMatematikselIslem<int> matIslemi = (IMatematikselIslem<int>)islem;
    Satırı ile nesnenin arayüze referansını verdik.
  6. Daha sonrada matIslemi arayüz referansı ile aşağıdaki satırı kullanarak IslemYap metodunu çağırdık.
    int sonuc = matIslemi.IslemYap(10, 20);
  7. Sonra da elde ettiğimiz sonucu ekrana yazdık.
  8. Eğer kayıt <int> türünü uygulamamışsa, <double>'ı uygulamış olabilir diye kontrol ettik ve uygun olanlar için 5. , 6. ve 7. adımları uyguladık.
  9. Şayet bu iki kontrolde de başarısız olursa bu işlemin arayüzünü uygulamadığını anlıyoruz ve çalıştırmıyoruz.

 

Aklınıza şu soru gelecektir, niye? Çünkü biz burada IMatematikselIslem arayüzünü uygulamayan ToplamaIslemi sınıfının içinde IslemYap isimli bir metod olduğunu biliyoruz, ama emin miyiz? Ya yoksa, ya da şartlara uymuyorsa. Kodu kendimiz yazmadığımız durumlarda bunu daha iyi anlayabilirsiniz. Programımızı çalıştırınca aşağıdaki gibi bir çıktı oluşturacak

Gördüğünüz gibi oluşturduğumuz arayüz sayesinde, arayüz referansını kullanarak sınıf nesnemizin içinde ki metodu çalıştırdık ve arayüz uygulanmış olduğu içinde istediğimiz gibi olduğuna emin olduk.

 

Son olarak uygulamayı şu şekilde düzenleyelim. Uygulamanın içinde bulunan matematiksel işlem yapan sınıfların her birini ayrı bir DLL haline getirelim ve uygulamamızın bulunduğu dizinde bulunan Islemler içindeki bir klasöre atalım. Daha sonra uygulamadan burada bulunan DLL'leri uygulamaya yükleyelim ve içlerinde bulunan sınıfların metodlarını kontrol ederek çağıralım.

static void Main(string[] args)
        {
            // programın çalıştığı klasörü tespit edip, Moduller klasörünü ekliyoruz.
            string modullerKlasorPath = AppDomain.CurrentDomain.BaseDirectory + "Moduller\\";
            // Bu klasöre ulaşıyoruz
            System.IO.DirectoryInfo modullerKlasoru = new System.IO.DirectoryInfo(modullerKlasorPath);
          // .dll uzantılı dosyaları dolaşıyoruz
            foreach (System.IO.FileInfo dosya in modullerKlasoru.GetFiles("*.dll"))
            {
                // elimizdeki dosyayı Assembly olarak yüklüyoruz.
                System.Reflection.Assembly modul = System.Reflection.Assembly.LoadFile(dosya.FullName);
                // Yüklenen assembly'nin içindeki türleri dolaşıyoruz
                foreach (Type t in modul.GetTypes())
                {
                    // elimizdeki assembly bir sınıfa mı ait yoksa başka bir türe mi (örneğin interface)
                    if (t.IsClass)
                    {                       
                       bool intKontrol = Activator.CreateInstance(t) is IMatematikselIslem<int>;
                       bool doubleKontrol = Activator.CreateInstance(t) is IMatematikselIslem<double>;
                       if (intKontrol)
                       {
                           // bu <int> türünde arayüz uygulanmış bir sınıf, çalıştıralım artık.
                           IMatematikselIslem<int> p = (IMatematikselIslem<int>)Activator.CreateInstance(t);
                                     int sonuc = p.IslemYap(10, 20);
                           Console.WriteLine("Islem:" + t.ToString() + ", sonuç: " + sonuc.ToString());
                       }
                       else if (doubleKontrol)   // double da olabilir.
                       {
                        
                           // bu <double> türünde arayüz uygulanmış bir sınıf, çalıştıralım artık.
                           IMatematikselIslem<double> d = (IMatematikselIslem<double>)Activator.CreateInstance(t);
                         
                               double sonuc = d.IslemYap(10.0, 2.5);
                               Console.WriteLine("Islem:" + t.ToString() + ", sonuç: " + sonuc.ToString());
                       }
                           else
                           {
                               Console.WriteLine(t.ToString() + " türü IMatematikselIslem arayüzünü uygulamadığı için çalıştırılamamaktadır");
                           }
                       
                    }
                }
                
            }            

        }

Bu kodu da çalıştırdığımız zaman aşağıdaki gibi bir çıktı oluşuyor.

 

İnşallah bu sefer Interface (arayüz) kavramını açıklama şansı bulabilmişimdir. Bu uygulamada yapılan iki örneği de aşağıdaki bağlantıyı kullanarak indirebilirsiniz.

 

İndir

4 kişi tarafından 4.0 olarak değerlendirildi

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: , ,

.Net Framework | C#

P & P - Application Architecture Guide 2.0

evrenayan tarafından yazılmıştır. 8. Şubat 2009 23:24

.Net platformunda geliştirilen uygulamalar için mimari ve tasarım anlamında bir klavuz olarak planlanan Application Architecture Guide 2.0'ın release versiyonu yayınlandı. Bir cep klavuzu serisi şeklinde yayınlanmış olan Application Architecture Guide 2.0 için planlayıcı takım hala geri bildirimler almaya devam ediyor. 

Proje hakkında detaylı bilgi almak için burayı, dokümantasyonu indirmek için burayı tıklayabilirsiniz.

1 kişi tarafından 4.0 olarak değerlendirildi

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

.Net Framework | Duyurular

WWF(Windows Workflow Foundation) Tabanlı İş Akışlarında Görev Yetkilendirmesi

evrenayan tarafından yazılmıştır. 3. Şubat 2009 23:04

Eğer Sharepoint üzerinde geliştirdiğiniz iş akıilarında WWF(Windows Workflow Foundation) altyapısını kullanıyorsanız ve başarıya da ulaştınız, yani gerekli görevleri gerekli kişilere başarılı bir şekilde ve sırayla atadıysanız her şeyin yolunda olduğunu düşünmek için çok acele etmeyin.
 
Biliyoruz ki Sharepoint içerisinde Site Collection, Site, Liste ve Item seviyesinde yetkiler verilebiliyor ama otomatik olarak yaratılmış bir workflow görevinde kim bu itemlara teker teker yetki verecek. Peki yetki vermezsek ne olur, bu durumda tüm kullanıcıların ilgili görevleri onaylamak için görev (task) listesinde contribute(katılım) hakkı olacağından herkes herkesin görevini yetki olmaksızın onaylayabilecek veya reddedebilecek demektir.
 
Bu durumda iş akışını kodlarken görevin yaratılışı esnasında bazı özel yetkilendirmeler yapıyor olmamız gerekir. Chris O'Brien bu konuda oldukça detaylı bir blog postunu yayınlamış.
 

1 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: , ,

.Net Framework | Sharepoint

Ücretsiz Ado.Net Entity Framework Kitabı

aokocax tarafından yazılmıştır. 16. Ocak 2009 22:54

Daha önce kendi blog’unda Ado.Net Entity Framework hakkında birçok yazı ve makale kaleme alan Zeeshan Hirani, çalıştığı şirketinin projelerini Ado.Net Entity Framework’a taşıma kararı almasıyla birlikte, blog’undaki  yazılarını bir kitap olarak derleyerek firma çalışanlarına sunmaya karar vermiş. Zeeshan aynı zamanda eski yazılarından derlediği bu kitabı ücretsiz olarak kamuya da açmış bulunuyor. Belirtilen linklerde bilgisayarınıza indirerek okuyabilirsiniz. Kitabın yanında örnek projelerde ilgili linklerde yer almakta. Zeeshan’ın İngilizce kaynağın bile sınırlı sayıda bulunduğu Entity Framework alanında böyle bir kaynağı ücretsiz olarak sunması gerçekten saygı değer bir tutum. Kendisini tebrik ediyoruz.

EBook

Projeler

Açılan sayfalarda download butonlarında basınız.

2 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: ,

.Net Framework | Ado.Net

Visual Studio 10 ve .Net Framework 4.0 Hazırlıkları

aokocax tarafından yazılmıştır. 2. Ocak 2009 14:10


MSDN tv’de (Channel 9) yayınlanmaya başlayan yeni bir video serisi ile visual Studio 10 (2010) ve .net Framework 4.0 daha yakından görmek isteyenler için güzel bir fırsat sunuluyor. Videolarda ilgili sitelerden gerekli olan CTP (Community Technology Preview) dosyalarının nasıl indireleceğinden ve Virtual PC ayarlarının nasıl yapılması gerektiğine kadar bütün bilgiler mevcut. Videolara ve MSDN (Channel 9) altında oluşturlan bölüme ulaşmak için linkleri takip ediniz.

Video Episode 1 Visual Studio 2010 CTP VPC Ayarları

Video Episode 2 Visual Studio 2010

Video Episode 3 Asp.Net Web Form 4.0

MSDN Channel 9 [10-4] Bölümü

3 kişi tarafından 5.0 olarak değerlendirildi

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: ,

.Net Framework | Haberler | Visual Studio

Powered by BlogEngine.NET 1.4.5.0
Bu tema Mads Kristensen tarafından yapılmıştır ve Türkçeleştirilmesi Blog Engine Türkiye ekibi tarafından yapılmıştır.

Yazar Hakkında

Something about the author

Son Yorumlar

Comment RSS