9 Eylül 2015

Delegates 5 :Delegates vs Interfaces

Bir sorun delegate ile çözülebiliyorsa aynı zamanda interface ile de çözülebilir. Daha önceki delegate örneklerinde çözdüğümüz bir problemi aşağıdaki kodda interface kullanarak çözdük.
using System;

namespace DelegatesVsInterfaces
{
    /*Delegate ile çözülen bir problem aynı zamanda interface ilede çözülebilir.
     * Aşağıdaki örneği mesela interface ile çözelim.
     */
    public interface ITransformer
    {
        int Transform(int x);
    }
    public class Util
    {
       public static void TransformAll(int[] values,ITransformer t)
       {
           for (int i = 0; i < values.Length; i++)
            {
                values[i] = t.Transform(values[i]);
            }
       }
    }
    class Squarer : ITransformer
    {
        public int Transform(int x) { return x * x; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int[] values = { 1, 2, 3 };
            Util.TransformAll(values, new Squarer());
            foreach (int  i in values)
            {
                Console.WriteLine(i);
            }
            Console.ReadKey();
        }
    }
}
Fakat aşağıdaki durumlardan biri yada daha fazlasını sağlıyorsa delegate kullanmak daha iyi bir seçim olabilir.
  • Bir interface sadece bir method tanımlıyorsa. 
  • Multicast(Çoklu Uygulama) gerekiyorsa.
  • Interface elemanlarını birden çok defa kullanmak gerekiyorsa.


Yukarıda ki örnekte multicast bir uygulama yoktur. Ama  sadece bir method tanımlıydı. Ve interface elemanlarını birden fazla kullanmamıza gerek kalmadı örneğin Square(Kare),Cube(Küp) gibi.

Eğer iki tane uygulamamız gerekseydi Aşağıdaki gibi yapacaktık.


using System;

namespace DelegatesVsInterfaces
{
    /*Delegate ile çözülen bir problem aynı zamanda interface ilede çözülebilir.
     * Aşağıdaki örneği mesela interface ile çözelim.
     */
    public interface ITransformer
    {
        int Transform(int x);
    }
    public class Util
    {
        public static void TransformAll(int[] values, ITransformer t)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = t.Transform(values[i]);
            }
        }
    }
    class Squarer : ITransformer
    {
        public int Transform(int x) { return x * x; }
    }
    class Cuber : ITransformer
    {
        public int Transform(int x) { return x * x * x; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            int[] values = { 1, 2, 3 };
            Util.TransformAll(values, new Cuber());
            foreach (int i in values)
            {
                Console.WriteLine(i);
            }
            Console.ReadKey();
        }
    }
}
Burada dikkat ederseniz her method için ayrıca bir class tanımlamak zorunda kalıyoruz. Bu bize gereksiz kod kalabalığına sebep oluyor. Bu yüzden delegate ile yazmak hem kodlarımızda biraz estetiklik sağlar hemde daha kullanışlı olmasını sağlar..