9 Eylül 2015

Delegates 6 : Delegate Compability(Uyumluluk)

Type compability:

using System;

namespace DelegateCompatibility
{
    class Program
    {
        delegate void D1();
        delegate void D2();

        static void Method1(){}
        static void Main(string[] args)
        {
            D1 d1 = Method1;
            //D2 d2 = d1;//!Hata delegate ler birbirileriyle uymsuzdur.Bu yüzden hata verir.
            //Ama aşağıdaki gibi tanımlayabiliriz.
            D2 d2 = new D2(d1);

            //Eğer aynı delegateler aynı sırayla aynı methodlara sahiblerse bunlar birbirlerine eşit sayılabilirler.
            //Örneğin
            D1 d3 = Method1;

            Console.WriteLine(d1 == d3);//True

            Console.ReadKey();

        }
    }
}
 Parameter compability:

 Contravariance özelliğini sağlamaktadır. Aşağıdaki örnekte string türü olan bir methoda object türü de uygulanabilmektedir.

using System;

namespace DelegateCompatibility
{
    class Program
    {
        delegate void StringAction(string s);

        static void ActionOnObject(object o)
        {
            Console.WriteLine(o);//Hello
        }
        static void Main(string[] args)
        {
            StringAction sa = new StringAction(ActionOnObject);
            sa("Hello");
        }
    }
}
 Return type compability:

Covariance özelliğini sağlamaktadır.  Aşağıdaki örnekte görüldüğü gibi object türünde bir delegate string metdounu desteklemektedir.

using System;

namespace DelegateCompatibility
{
    class Program
    {
        delegate object ObjectRetriever();
        static string RetriveString() { return "hello"; }
        static void Main(string[] args)
        {
            ObjectRetriever or = new ObjectRetriever(RetriveString);
            object result = or();
            Console.WriteLine(result);

            Console.ReadKey();
        }
    }




Not:
Contravariance alt kümeden üst kümeyi desteklemesi durumudur.(string-->object)
Covariance    üst kümenin alt kümeyi sağlaması durumudur.(object-->string)