6. Rozhraní

Jazyk C# neumožňuje vícenásobnou dědičnost. Díky rozhraním jsme schopni třídám přidávat jisté charakteristiky nebo schopnosti nezávisle na hierarchii tříd. Definice rozhraní začíná klíčovým slovem interface, po které následuje jeho jméno. Ve složených závorkách je pak tělo rozhraní, které může obsahovat výčet metod (jen hlavička metody bez těla), vlastnosti, indexerů a událostí. U rozhraní jsou všechny členy automaticky veřejné (public).

[ukázka kódu]
public interface IComparable
{
  int Compare(Object second);
  int SomeProperties
  {
    get;
  }
  object this[int index]
  {
    get;
    set;
  }
}

class SomeClass : AnotherClass, IComparable
{
  int Compare(Object second)
  {
    ...
  }
  ...
}

Jak již bylo řečeno, jazyk C# podporuje pouze jednoduchou dědičnost. Tím jsme se vyhnuli kolizi jmen. C# ale umožňuje, aby třída implementovala několik rozhraní. V takovém to případě se kolizi jmen nevyhneme. Nabízené řešení je kvalifikovat členské jméno jménem rozhraní. U jména metody (nebo jiného člena rozhraní) je vynechán modifikátor public a před toto jméno je přidáno jméno rozhraní. Takovýto člen pak bude přístupný pouze pomocí daného rozhraní (jako by ani nebyl implementován v dané třídě).

[ukázka kódu]
public interface IA
{
  void Test();
}
public interface IB
{
  void Test();
}
public class SomeClass : IA, IB
{
  void IA.Test() {}
  void IA.Test() {}
  public static void Main()
  {
    SomeClass test = new SomeClass();
    test.Test(); //error
    ((IA)test).Test() 
    IB b=new SomeClass();
    b.Test();
  }
}

Rozhraní lze rozšiřovat a kombinovat pomocí dědičnost. Takto lze přidávat další metody, slučovat několik rozhraní do jednoho nebo předefinovat existující metodu. Následující příklad demonstruje jak lze kombinovat rozhraní.

[ukázka kódu]
public interface IA
{
  void Test();
}
public interface IB
{
  void Test();
}
public interface IC : IA, IB
{
  new void Test();
  void AnotherMethod();
}

Při vlastní implementaci takovéhoto rozhraní lze kvalifikovat jednotlivé členy. Při implementaci představeného příkladu máme v podstatě tři možnosti.

  • Třída může implementovat jednu veřejnou metodu Test.

  • Třída může implementovat tři kvalifikované metody Test, pro každé rozhraní zvlášť.

  • Třída může implementovat nějakou kombinaci předcházejících postupů.