Základ C# 17 – Preťaženie operátorov [Operators overloading]

V triedach C# je možné nahradiť funkčnosť operátorov a rozšíriť tak funkčnosť vlastných tried.

Pri bežných dátových typoch sú operácie ako pripočítavanie, porovnávanie alebo násobenie jednoduché. Pri vlastných triedach je väčšinou nutné definovať vlastné metódy, ktoré toto riešia.

Typy operátorov

Operátori sa delia podľa rôznych kritérií. Jedno zo základných je na operátori porovnávacie, ktoré porovnávajú a funkčné, ktoré slúžia na úpravu stavu objektov.

Druhé delenie je na unárne a binárne operátori. Pokiaľ používate binárny operátor, ovplyvňujete ním dva rôzne objekty – napríklad pri spočítavaní dvoch čísel. Pri unárnych operátoroch ovplyvňujete len jeden objekt, a to napríklad znamienkom mínus pri záporných číslach.

Vlastné operátori

Ako príklad použijeme triedu Vektor, ktorá v sebe bude mať dve premenné typu float – X a Y.

public class Vektor
{
   public float X;
   public float Y;

   public Vektor(float X, float Y)
   {
      this.X = X;
      this.Y = Y;
   }
}

Aby ste nahradili operátor na spočítanie, môžete použiť skoro klasickú metódu, len namiesto mena napíšete operator +, čím nahradíte práve funkčnosť operátora +. Táto funkcia MUSÍ byť statická.

public static Vektor operator +(Vektor v1, Vektor v2)
{
   return new Vektor(v1.X + v2.X, v1.Y + v2.Y);
}

Týmto kódom nahradíte operátor + triedy Vektor. Ako prvý vstupný a výstupný typ by mal byť použitý rovnaký typ ako je vaša trieda. Operátor môžete v jednej triede nahradiť aj viacerými jeho verziami, a to napríklad verziou, ktorá má ako druhý parameter hodnotu float.

public static Vektor operator +(Vektor v, float p)
{
   return new Vektor(v.X + p, v.Y + p);
}

Pokiaľ by ste chceli nahradiť funkciu na porovnanie, môžete jednoducho nahradiť operátor ==, kde ako výstupný typ použijete bool.

public static bool operator ==(Vektor v1, Vektor v2)
{
   return ((v1.X == v2.X) && (v1.Y == v2.Y));
}

Použitie nahradených operátorov

Nahradené operátori je možné použiť ako klasické operátori s parametrami, ktoré ste definovali.

Vektor V = new Vektor(3, 8) + new Vektor(16, 3);

Toto spočítanie bude klasicky fungovať a ako výsledok dostanete Vektor s hodnotou X = 19 a Y = 11.

Indexovacie operátori

Indexeri sú operátori dovoľujúce jednoduchý prístup k častiam objektu. Používajú sa napríklad pri poliach k prístupu k jednotlivým uloženým položkám.

Indexeri môžete definovať vo vlastných triedach na jednoduchší prístup k rôznym prvkom. Môžete ich definovať podobne ako pri nahradzovaní operátoroch a to napísaním vlastnej metódy, ktorá však nebude statická. Jej meno bude this a parameter zadáte do hranatých zátvoriek. Následne klasický použijete get alebo set na použitie.

public float this[int hodnota]
{
   get
   {
      if (hodnota== 0) return this.X;
      else if (hodnota== 1) return this.Y;
      else throw new IndexOutOfRangeException();
   }
   set
   {
      if (hodnota == 0) this.X = value;
      else if (hodnota = 1) this.Y = value;
      else throw new IndexOutOfRangeException();
   }
}

Ako typ v hranatých zátvorkách môžete použiť akýkoľvek typ – pri tejto triede by sa hodilo viac použitie typu char a použitie písmen X a Y. Pokiaľ použijete indexeri, môžete premenným X a Y nadstaviť modifikátor private. Ako to využijete už nechám na vás.

Po dnešnom, pomerne náročnejšom diely si nabudúce ukážeme niečo jednoduchšie a to ručne definované konverzie tried.

Pridajte Komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *

Scroll to Top