This article has been localized into Czech by the community.
Rozhraní
V předchozích kapitolách jsme se podívali na abstraktní třídy. Rozhraní (interfaces) jsou velmi podobná abstraktním třídám a sdílejí skutečnost, že z nich nelze vytvořit žádné instance. Avšak rozhraní jsou ještě koncepčnější než abstraktní třídy, jelikož vůbec nejsou povoleny žádné těla metod. Takže rozhraní je něco jako abstraktní třída s ničím než abstraktními metodami a jelikož neexistují metody s aktuálním kódem, není potřeba žádných polí. Vlastnosti jsou však povoleny, stejně jako indexery a události. Rozhraní můžete považovat za smlouvu - třída, která jej implementuje, je povinna implementovat všechny metody a vlastnosti. Avšak nejdůležitější rozdíl je, že zatímco C# nedovoluje vícenásobnou dědičnost, kdy třídy dědí více než jednu základní třídu, skutečně dovoluje implementaci více rozhraní!
Jak to tedy všechno vypadá v kódu? Zde je docela kompletní příklad. Podívejte se na něj, možná to vyzkoušejte sami a poté čtěte dál pro úplné vysvětlení:
using System;
using System.Collections.Generic;
namespace Interfaces
{
class Program
{
static void Main(string[] args)
{
List<Dog> dogs = new List<Dog>();
dogs.Add(new Dog("Fido"));
dogs.Add(new Dog("Bob"));
dogs.Add(new Dog("Adam"));
dogs.Sort();
foreach(Dog dog in dogs)
Console.WriteLine(dog.Describe());
Console.ReadKey();
}
}
interface IAnimal
{
string Describe();
string Name
{
get;
set;
}
}
class Dog : IAnimal, IComparable
{
private string name;
public Dog(string name)
{
this.Name = name;
}
public string Describe()
{
return "Hello, I'm a dog and my name is " + this.Name;
}
public int CompareTo(object obj)
{
if(obj is IAnimal)
return this.Name.CompareTo((obj as IAnimal).Name);
return 0;
}
public string Name
{
get { return name; }
set { name = value; }
}
}
}
Začněme uprostřed, kde deklarujeme rozhraní. Jak vidíte, jediný rozdíl oproti deklaraci třídy je použité klíčové slovo - interface místo class. Také název rozhraní je prefixován znakem „I“ pro Interface (Rozhraní) - to je jednoduše standard, nikoli požadavek. Své rozhraní můžete pojmenovat, jak chcete, ale protože se používají tak podobně jako třídy, že byste mohli mít problém rozlišit rozdíl v některých částech kódu, prefix „I“ dává celkem smysl.
Poté deklarujeme metodu Describe a poté vlastnost Name, která má klíčová slova get i set, což z této vlastnosti dělá čitelnou a zapisovatelnou vlastnost. Také si všimnete absence modifikátorů přístupu (public, private, protected atd.), což je dáno tím, že v rozhraní nejsou povoleny - jsou implicitně všechny veřejné (public).
Další je naše třída Dog. Všimněte si, jak to vypadá stejně jako dědění z jiné třídy, s dvojtečkou mezi názvem třídy a třídou/rozhraním, které je podtřídou/implementováno. V tomto případě jsou však pro stejnou třídu implementována dvě rozhraní, jednoduše oddělena čárkou. Můžete implementovat tolik rozhraní, kolik chcete, ale v tomto případě implementujeme pouze dvě - naše vlastní rozhraní IAnimal a rozhraní .NET IComparable, které je sdíleným rozhraním pro třídy, které mohou být řazeny. Jak vidíte, implementovali jsme jak metodu, tak vlastnost z rozhraní IAnimal, stejně jako metodu CompareTo z rozhraní IComparable.
Možná si teď myslíte: Pokud musíme veškerou práci udělat sami, implementováním celých metod a vlastností, proč se s tím vůbec obtěžovat? A velmi dobrý příklad, proč je to vůbec hodno vašeho času, je uveden na začátku našeho příkladu. Zde přidáme do seznamu řadu objektů Dog a poté seznam seřadíme. A jak seznam ví, jak má řadit psy? Protože naše třída Dog má metodu CompareTo, která umí říct, jak porovnat dva psy. A jak seznam ví, že náš objekt Dog to umí udělat právě tak a kterou metodu zavolat, aby psy porovnal? Protože jsme mu to řekli, implementací rozhraní, které slibuje metodu CompareTo! To je skutečná krása rozhraní.