using System;Fakat aşağıdaki durumlardan biri yada daha fazlasını sağlıyorsa delegate kullanmak daha iyi bir seçim olabilir.
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();
}
}
}
- 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;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..
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();
}
}
}