# Skuska 25.1.2010

<{ForumPost(poster="atombomb", timestamp=2010-01-26 09:06:36)}>
Cele zadanie si nepamatam, co si ale pamatam je, ze sa menili niektore otazky.   
  
Co spravi nasledujuci program:

    public static Main(){
    L1        string [] pole1 = { "helo" };
    L2        object [] pole2 = pole1;
    L3        pole2[0] = new Object();
               Console.WriteLine(pole2[0]);
    }

spadne na L1, spadne na L2, spadne na L3, neprelozi sa, vypise "System.Object" (spadne na L3: Attempted to access an element as a type incompatible with the array)  
  
Zjednodusila sa otazka na implementovanie niecoho:

    Interface I<T>{
        T m();
    }
    
    class Foo: I<int>, I<double>{
    }
    

mate dopisat telo triedy foo tak, aby metoda m() vzdy vracala 0:  
spravne riesenie mohlo byt napr  

    class Foo: I<int>, I<double>{
       double I<double>.m(){return 0;} //tu sa 'public' NEPISE 
       public int m() {return 0;} //tu nezabudnite 'public' ;)
    }
    

dalej bolo nieco ako 
        

            BB<int> bb = new CC<int>();
            BB<CC<int>> bbcc= new CC<CC<int>>();

co potom urobia nasledujuce riadky:
        

        
            Console.WriteLine(bb is BB<int>);
            Console.WriteLine(bb is CC<int>);
            Console.WriteLine(bbcc is CC<BB<int>>);
            Console.WriteLine(bbcc is BB<CC<int>>);
            Console.WriteLine(bb.GetType() == typeof(BB<int>));
            Console.WriteLine(bb.GetType() == typeof(CC<int>));

(moznosti boli true, false, neskompiluje sa)    
Tu si treba uvedomit, ze getType ziska presny typ premennej (nezohladnuje dedicnost) a 'is' zistuje ci sa da premenna pretypovat na typ bez vyhodenia exception (teda zohladnuje dedicnost). (true,true,false,true,false,true)  
Ako je to s riadkom "bbcc is CC<BB<int>>" neviem dobre vysvetlit.  
  
Nieco o tom, co plati/neplati o strukturach.  
Chytak bol, ze struktury je mozne vytvorit aj na halde (zabalene v triede).   
A pre takych ako ja: struktury dedia len od interfacov a classy sa nededia od struktur a preto struktury nemaju virtualne metody.  
  
  
Dalsia novinka bola, o triede streamWriter. Ten musi byt explicitne flushnuty (metoda close/flush) aby sa vyprazdnilo to co ma v buffri. Otazka bola, ci je mozne rozsirit tuto triedu tak, aby sa buffer sam flushol ked sa streamWriter finalizuje garbage collectorom.   
Potom tam bolo viacero moznosti, spravna bola:  
"nie, lebo finalizery sa nevykonavaju v pevnom poradi"   
  
A na konci bola otazka suvisiaca s extension metodami.  
mame kod:

    class TimeSpan{
         public TimeSpan(int hours, int minutes, int seconds){....}
    }
    ...
    public static void Main{
         TimeSpan foo = 2.Hours();
         Console.WriteLine( foo.hours);
    }

a otazka bola, ako sa ma kod doplnit aby to fungovalo a vypisalo 2 (predpoklada sa ze TimeSpan ma polozku hours verejnu). Na vyber bolo 5 moznosti:  
jedna ze to nejde,  
jedna zalozena na tom, ze int sa implicitne pretypuje na triedu a na nej sa zavola metoda 

    Hours(){
        return new TimeSpan((int)this,0,0);
    }

dalsia zalozena na tom istom, ale islo o pretypovanie na strukturu  
moznost s extension metodou, ktora vyuzivala double  
moznost s extension metodou, ktora vyuzivala int - tato bola spravna  
  
Kto si pamatate viac, pls spresnite.
<{/ForumPost}>

<{ForumPost(poster="wladik", timestamp=2010-01-27 19:26:19)}>
**Ohledně otázky na haldy -  rozhodněte o pravdivosti:**  
NE - Mohou mít libovolnou třídu jako předka.  
NE - Mohou mít libovolnou strukturu jako předka.  
ANO - Vždy mají bezparametrický konstruktor.  
ANO - Jejich instance mohou být na haldě.  
ANO - Jejich instance mohou být na zásobníku.  
NE  - Lze v nich definovat nové virtuální metod.  
NE  - Implicitní viditelnost jejich členů je public.   
  
Pak byla ještě otázka  
**Označit všechny referenční typy**

    [ ] System.Int64 
    [x] object
    [x] List<int>
    [ ] long
    [x] S?[,,]
    

a reseni na extension methods  
  
bylo nejak takto

    static class X {
      public static System.TimeSpan Hours(this System.Int32 hour) {
         return new System.TimeSpan((int)hour, 0, 0);
      }
    }
    


<{/ForumPost}>

