TOC

This article has been localized into Czech by the community.

Třídy:

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í.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!