Úlohy na procvičení

Virtuální metody

Co vypíše následující program? Jaké jsou typy proměnných b, d, d2 a d3?

namespace dedicnost;

class Base
{
    public void A() { Console.WriteLine("Base.A"); }
    public virtual void B() { Console.WriteLine("Base.B"); }
    public virtual void C() { Console.WriteLine("Base.C"); }
}

class Derived : Base
{
    public new void A() { Console.WriteLine("Derived.A"); }
    public override void B() { Console.WriteLine("Derived.B"); }
    public new void C() { Console.WriteLine("Derived.C"); }
}

class Program
{
    static void Main(string[] args)
    {
        var b = new Base();
        var d = new Derived();

        b.A();
        b.B();
        b.C();

        d.A();
        d.B();
        d.C();

        Base d2 = d;
        d2.A();
        d2.B();
        d2.C();

        var d3 = (Base)d;
        d3.A();
        d3.B();
        d3.C();
    }
}

Diskrétní simulace pošty

Máme poštu s jednou přepážkou, kde se dají vyzvedávat balíky. Pošta nabízí dvě služby: vyzvednutí balíku a vyzvednutí s kódem. Vyzvednutí balíku trvá náhodně 2 až 4 minuty. Vyzvednutí s kódem je rychlejší, protože zaměstnanci pošty začnou balík připravovat hned po zadání kódu do vyvolávacího systému, takže trvá jen 1 až 2 minuty. Jednu minutu po otevření pošty přijdou první dva zákazníci, jeden bez kódu a jeden z kódem. Další zákazníci bez kódu přicházejí v náhodných intervalech 1 až 5 minut a zákazníci s kódem přicházejí také v náhodných intervalech 1 až 5 minut. Pošta zavírá 30 minut po otevření, nicméně obslouží ještě všechny zákazníky, kteří už jsou ve frontě.

Naprogramujte simulaci pošty a porovnejte několik způsobů vyvolávacího systému (fronty):

  1. Všichni zákazníci se řadí podle času příchodu a čekají ve společné frontě.
  2. Zákazníci s kódem mají přednost a oddělenou frontu (pokud je někdo ve frontě s kódem, tak se obslouží dřív než kdokoliv bez kódu, i když přišel později).
  3. Zkuste vymyslet vlastní způsob vyvolávacího systému, který preferuje rychlé vyzvednutí s kódem, ale zároveň neblokuje úplně zákazníky bez kódu.

Simulace by měla průběžně vypisovat všechny důležité události, vždy s aktuálním časem (v minutách). Na konci simulace vypište průměrnou dobu čekání pro zákazníky s kódem a bez kódu.

Zkuste se zamyslet, jaké události budou nastávat. Jaké entity (lidi, věci, …) potřebujeme v programu reprezentovat?

Učební výstupy

Učební výstupy podávají zhuštěný souhrn základních konceptů a dovedností, které byste měli umět vysvětlit a/nebo použít po každém cvičení.

  • chápat význam klíčových slov virtual a override v kontextu virtuálních metod
    • umět vysvětlit, jak jsou virtuální metody implementované pomocí tabulky virtuálních metod (VMT)
  • umět implementovat diskrétní simulaci (discrete event simulation) podle zadaného popisu
    • vhodně reprezentovat události a jejich kalendář
    • vytvořit model zadaného problému (jeho reprezentaci pomocí programu)