Vse o Programiranju 3

Generiki

Generiki

by Matija Lokar -
Number of replies: 2

Ena od vaših predlaganih nalog za izpit je:

Napiši funkcijo vsota(T prvi, T drugi), ki za dva podatka poljubnega tipa (a med seboj enakega) vrne vsoto. Za tipe int, double, float naj bo to kar navadna vsota. Za tip string naj bo vsota dolžin nizov. Za tip boolean pa naj bo True, če imata prvi in drugi enako vrednost in False sicer. (Težavnost 2, 20T)


Res me zanima, kako bi jo rešili. S preobteževanjem gre, a z generiki? Kako?

Je pa zanimiva naloga in čisto primerna za izpit ... 

In reply to Matija Lokar

Re: Generiki

by Damijan Randl -
Se opravičujem za zmedo pri tej nalogi. Za to nalogo je bilo res mišljeno, da se jo reši s preobteževanjem, kjer oznako T zamenjamo s ustreznim tipom spremenljivke. 

Ker pa me je zanimalo, ali se da vseeno rešiti tudi z generiki, sem pogledal na spletu, če obstaja kakšna rešitev. Težava pri tej nalogi je namreč o tem, da pri seštevanju ne moremo nastaviti omejitve (public static T funkcija<T>(T podatek1, T podatek2) where T: (omejitev -> lahko_seštevamo)), kot lahko to naredimo na primer z IComparable. 

Mislim, da je ena od rešitev lepo opisana na temelem linku: 
Osnovna ideja pa je, da definiramo nov razred (podoben kot IComparable), ki omogoča seštevanje za nek poljuben tip. Ta razred potem navedemo kot omejitev.  V where stavek lahko dodamo tudi več omejitev, zato bi lahko naredili tudi več razredov. 

Seveda pa potem ta naloga verjetno ni več primerna za izpit :) 

Mimogrede, težavnost pri tej nalogi sem ocenil na 2 od 3 in ne 2 od 10, kot je bilo to priporočeno na spletni učilnici (ker sem ta del prej nekoliko spregledal).
In reply to Damijan Randl

Re: Generiki

by Matija Lokar -
Ne, ne, nobene večje zmede. Le priložnost, da se kaj naučimo.  Povezava, ki jo je navedel Damjan, je dobra in vam priporočam, da jo naštudirate. Gre pa tudi z dynamic (a pozor, dynamic uporabljati je malček nevarno, ker s tem prevajalniku naročimo, da naj "nič ne pazi"). 

A recimo, da nas ne moti - potem gre takole (poglejte dva načina izvedbe seštevanja nizov!)

 public static T vsota<T>(T prvi, T drugi)
        {
            dynamic p = prvi;
            dynamic d = drugi;

            if (p is bool)
                return p == d;
            if (p is string)
            {
                dynamic rez = $"Dolz:{p.Length + d.Length}";
                return rez;
            }
            dynamic vs = p + d;
            return vs;
        }
        public static int vsota(String prvi, String drugi)
        {
            return prvi.Length + drugi.Length;
        }
        static void Main(string[] args)
        {
            Console.WriteLine(vsota(10, 5));
            Console.WriteLine(vsota(10.5, 5.5));
            Console.WriteLine(vsota(10, 5.0));
            Console.WriteLine(vsota("10", "5"));
            Console.WriteLine(vsota<String>("10", "5"));
            Console.WriteLine(vsota(true, false));
        }

In da ne bo nesporazumov - ne, takšna naloga ne pride v poštev za izpit ;-)  Je pa fino, če te stvari poznate.