Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Crearea unei interfete generice

Generics reprezinta un mecanism care permite reutilizarea codului, sporind productivitatea programatorilor.
C# si CLR permit crearea interfetelor generice. Presupunem ca avem nevoie de o interfata care specifica un anumit comportament pentru un tip specificat de programator.

    //declararea unei interfete generice
    public interface IMyGeneric<T>
    {
        T Id { get; }
    }

    //implementarea interfetei generice pentru un tip specificat
    class MyIntClass : IMyGeneric<int>
    {
        private int _id;
        #region IMyGeneric<int> Members

        public int Id
        {
            get { return _id; }
        }

        #endregion
    }

    class MyStringClass : IMyGeneric<string>
    {
        private string _id;

        #region IMyGeneric<string> Members

        public string Id
        {
            get { return _id; }
        }

        #endregion
    }

Unele interfete definesc metode care au parametri/tip returnat Object. La apelarea acestor interfete, orice instanta al oricarui tip poate fi transmisa. Daca este tip valoare, va avea loc boxing. Exemplu in MyFirstMethod. In MySecondMethod fenomenul de boxing este eliminat, iar metoda devine strongly-type.

        static void MyFirstMethod()
        {
            int a = 0, b = 2;
            string c = "3";
            IComparable d = a;
            
            //este permisa transmiterea unei valoari de tip int
            d.CompareTo(b);
            //este permisa transmiterea unei valori de tip string, 
            //dar la runtime va fi aruncata o exceptie de tip ArgumentException
            d.CompareTo(c);
        }

        static void MySecondMethod()
        {
            int a = 0, b = 1;
            string c = "3";
            IComparable<int> d = a;
           
            //este permisa transmiterea unei valori de tip int
            d.CompareTo(b);
            //eroare la compilare, metoda interfetei este strongly typed
            d.CompareTo(c);
        }

BCL contine atat interfete generice cat si non-generice. Acestea din urma exista pentru a asigura backward compatibility.
O clasa poate implementa aceeasi interfata generica, atat timp cat tipul este diferit.

    public class MyClass : IComparable<int>, IComparable<string>
    {
        private int myVal = 1;

        #region IComparable<int> Members

        public int CompareTo(int other)
        {
            return myVal.CompareTo(other);
        }

        #endregion

        #region IComparable<string> Members

        public int CompareTo(string other)
        {
            return myVal.CompareTo(Int32.Parse(other));
        }

        #endregion
    }

    class Program
    {
        static void Main(string[] args)
        {
            MyClass m = new MyClass();
            Console.WriteLine(m.CompareTo(4));
            Console.WriteLine(m.CompareTo("4"));
            Console.Read();
        }
    }
Category: Uncategorized

Your email address will not be published. Required fields are marked *

*