Seminární skupiny 6 a 7

Týden 3

Rozhraní

Rozhraní umožňují definovat společné chování (metody) nebo vlastnosti i velmi různých objektů. Rozhraní se zapisují podobně jako třídy, ale používá se klíčové slovo interface místo class a také v sobě obsahují pouze deklarace metod, vlastností a dalších prvků (zatím nepoužíváme). Před jméno rozhraní se v knihovně .NET zapisuje velké písmeno I. Příklad rozhraní:

interface ICloseable
{
    // vsechny objekty implementujici ICloseable musi jit zavrit
    void Close();
}

Implementace rozhraní třídou pak může vypadat takto:

class Connection : ICloseable
{
    // Ukonci spojeni
    void Close()
    {
        ...
    }
}

Dědičnost a polymorfismus

Rozhraní slouží k definování požadovaného chování nebo vlastností více i velmi různých objektů. Dědičnost naopak slouží k rozšíření stávájících tříd o nové chování nebo vlastnosti a musí platit, že potomek je vždy plnohodnotným předkem. Představme si např. tiskárnu, která umí tisknout černobíle. Pokud ji "vylepšíme" tak, že bude tisknout barevně, můžeme ji považovat z hlediska programování za potomka tiskárny černobílé, protože zároveň "je" i tiskárnou černobílou. Právě o ten vztah "je" v dědičnosti jde.

class BlackPrinter
{
    // metoda tisku
    public virtual void Print()
    {
        System.Console.WriteLine("Printed black");
    }
}

class ColorPrinter : BlackPrinter
{
    // metoda tisku
    public override void Print()
    {
        System.Console.WriteLine("Printed with colors");
    }
}

Speciálním případem dědičnosti je vyjmutí společného základního chování (metod) nebo vlastností do abstraktního předka - objekt takového předka není "kompletní" a není možné jej vytvořit. Z abstraktního předka lze pouze dědit a pak vytvářet objekty potomků - s těmi lze plně zacházet jako s předky.

Rozšiřujicí metody

Pomocí rozšiřujicích metod můžeme přidávat užitečný kód k již existujícím a neměnným třídám, např. k těm, jejichž zdrojový kód nemáme k dispozici ke změně. Rozšiřujicí metoda se zapíše do třídy, která musí být statická - označena klíčovým slovem static. Instanci statické třídy nelze vytvořit. Také rozšiřujicí metoda je statická.
Takto by vypadala rozšiřujicí metoda k třídě Person, která má vlastnosti FirstName (jméno) a LastName (příjmení):

static class PersonExtensions
{
    // rozsirujici metoda vrati cele jmeno osoby
    public static string GetFullName(this Person person)
    {
        return person.FirstName + " " + person.LastName;
    }
}

Všimněte si klíčového slova this před názvem třídy, pro kterou klíčovou metodu vytváříme. Rozšiřujicí metodu je pak možné volat jako metodu třídy, pro kterou jsme ji psali, tj. pomocí tečkové notace.
Volání může vypadat takto - předání argumentu s this se vynechává:

Person person = new Person();
System.Console.WriteLine(person.GetFullName());