Sobes.tech
Junior

V akých prípadoch a na aké účely používame rozhrania v C#?

sobes.tech AI

Odpoveď od AI

Rozhrania v jazyku C# slúžia na nasledujúce účely:

  1. Definovanie zmluvy: Rozhranie definuje súbor členov (metódy, vlastnosti, udalosti, indexátory), ktoré trieda alebo štruktúra implementujúca toto rozhranie musí implementovať. To zabezpečuje jednotnosť správania rôznych typov.

    // Definovanie rozhrania
    public interface IDrawable
    {
        void Draw();
        int LineThickness { get; set; }
    }
    
    // Trieda, ktorá implementuje rozhranie
    public class Circle : IDrawable
    {
        public int LineThickness { get; set; }
    
        public void Draw()
        {
            // Logika kreslenia kruhu
        }
    }
    
  2. Polymorfizmus: Použitie rozhraní umožňuje pracovať s objektmi rôznych typov cez spoločný rozhraníový typ. Toho sa dosahuje tak, že akákoľvek referencia na objekt, ktorý implementuje rozhranie, môže byť prevedená na tento typ rozhrania.

    // Metóda, ktorá pracuje s akýmkoľvek objektom implementujúcim IDrawable
    public void Render(IDrawable item)
    {
        item.Draw(); // Volanie konkrétnej implementácie metódy Draw
    }
    
    // Použitie:
    IDrawable circle = new Circle();
    Render(circle); // Bude zavolaná implementácia Draw() z triedy Circle
    
  3. Viacnásobné dedičstvo (Multiple Inheritance): C# nepodporuje dedičstvo tried viac ako jednej, ale umožňuje triede alebo štruktúre implementovať viac rozhraní. To umožňuje typu mať správanie definované v rôznych "zmluvách".

    public interface ISaveable
    {
        void Save();
    }
    
    public interface ILoadable
    {
        void Load();
    }
    
    // Trieda, ktorá implementuje viac rozhraní
    public class ConfigurationManager : ISaveable, ILoadable
    {
        public void Save()
        {
            // Logika ukladania
        }
    
        public void Load()
        {
            // Logika načítania
        }
    }
    
  4. Slabé prepojenie (Decoupling): Použitie rozhraní znižuje závislosť medzi komponentami. Namiesto závislosti od konkrétnej triedy môže komponent závisieť od rozhrania. To uľahčuje výmenu implementácií a testovanie.

    public interface ILogger
    {
        void LogMessage(string message);
    }
    
    public class FileLogger : ILogger
    {
        public void LogMessage(string message)
        {
            // Logika zápisu do súboru
        }
    }
    
    public class DatabaseLogger : ILogger
    {
        public void LogMessage(string message)
        {
            // Logika zápisu do databázy
        }
    }
    
    public class ProcessingEngine
    {
        private readonly ILogger _logger;
    
        // Závislosť od rozhrania, nie od konkrétnej implementácie
        public ProcessingEngine(ILogger logger)
        {
            _logger = logger;
        }
    
        public void ProcessData()
        {
            // ...
            _logger.LogMessage("Dáta spracované.");
        }
    }
    
  5. Rozšíriteľnosť: Rozhrania umožňujú ľahké pridávanie nových implementácií existujúceho správania bez zmeny kódu, ktorý používa toto rozhranie.

  6. Dokumentácia a samodokumentovanie: Dobre pomenované rozhranie s komentármi ku svojim členom slúži ako forma dokumentácie, opisujúca, aké správanie sa očakáva od objektov implementujúcich toto rozhranie.