Vícenásobné přetížení operatoru THIS – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vícenásobné přetížení operatoru THIS – .NET – Fórum – Programujte.comVícenásobné přetížení operatoru THIS – .NET – Fórum – Programujte.com

 

Pawl0
Newbie
19. 8. 2012   #1
-
0
-

Ahoj,

Jak je možné dociílt něco podobného něco jako toto?

public int this[string st]
{
  get
  {
  ...
  }        
  set
  {
..            
  }
}

public bool this[string st]
{
  get
  {
  ...
  }       
  set
  {
..           
  }
}

-----------------

Pro LValue to lze pro GET nejde

public object this[string st]
{
  get
  {
       !! NEJDE !!
  }      
  set
  {
         if (value.typeof() == Type.init)

         ...
  }
}

Docházejí mě myšlenky.

Děkuji

Nahlásit jako SPAM
IP: 81.200.57.–
ingiraxo+15
Grafoman
20. 8. 2012   #2
-
0
-

nechápu co myslíš... tento zápis se jednoduše používá pro přístup do instance třídy přes index/klíč do nějakýho pole... takže přetížení v tomhle případě mockrát nebude (spíš kombinace).. viz příklad.:

    public class Bagr
    {
        private Hashtable table = new Hashtable();

        public string this[string key]
        {
            get { return table[key].ToString(); }
            set { table[key] = value; }
        }

        public string this[int key]
        {
            get { return table[key].ToString(); }
            set { table[key] = value; }
        }

        public object this[string key]
        {
            get { return table[key]; }
            set { table[key] = value; }
        }

        public object this[int key]
        {
            get { return table[key]; }
            set { table[key] = value; }
        }
    }

Nebo genericky...

    public class Bagr<K>
    {
        private Dictionary<K, Bagr<K>> data = new Dictionary<K, Bagr<K>>(10);

        public Bagr<K> this[K k]
        {
            get { return data[k]; }
            set { data.Add(k, value); }
        }
    }

Nebo mě napadl ještě jeden příklad, tak trochu exotičtější :D

    public class Bagr
    {
        public int this[params int[] values]
        {
            get
            {
                int sum = 0;
                foreach (int n in values) sum += n;
                return sum;
            }
        }

        public double this[double a, double b]
        {
            get { return a * b; }
        }

        public string[] this[string text, char delimiter]
        {
            get { return text.Split(delimiter); }
        }

        public bool this[bool isOk]
        {
            get
            {
                if (isOk)
                {
                    // ...
                }
                return false;
            }
        }
    }

Jinak řečeno to můžeš brát jako normální vlastnost, jen s tím rozdílem, že nemůže vracet void a parametry budou vždy v hranatých závorkách stylem pole...

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
liborb
~ Redaktor
+18
Guru
20. 8. 2012   #3
-
0
-

Jenom pozor na to, že funkce, a to ani přetěžované, se nemohou lišit jen v návratové hodnotě, takže v tom první příkladu od ingiraxo si budeš muset vybrat mezi object nebo string.

Nahlásit jako SPAM
IP: 78.80.52.–
Pawl0
Newbie
20. 8. 2012   #4
-
0
-

#3 liborb
Já právě potřebuju aby se měnil pouze návratové hodnoty.

Abych při použití:
Bagr neco = new Bagr();

int a = neco["CESTA/POLOZKA1"]
string b = neco["CESTA/POLOZKA2"]
if  (neco["CESTA/POLOZKA3"] == 12)

pouziti bez přetipování

Nahlásit jako SPAM
IP: 78.80.184.–
liborb
~ Redaktor
+18
Guru
20. 8. 2012   #5
-
0
-

To nejde, tj. není to technicky možné, tj. opravdu to nejde, tj. opravdu, ale opravdu to nejde. Jedinou další možnost tu zmínil ingiraxo, a to použití generický návratový typ, ale stejně ti nepůjde zapsat tak jednoduše, jak by sis přál.

Nahlásit jako SPAM
IP: 78.80.52.–
ingiraxo+15
Grafoman
20. 8. 2012   #6
-
0
-

jo, teď na to koukám co jsem dneska ráno psal.. asi se budu muset řídit pravidlem, že po pulnoci jít spát už :D ... takže z toho prvního příkladu ignoruj ty 2 vlastnosti s návratovou hodnotou object, to ti bude házet, že to neví co máš na mysli...

veškeré přetěžování se vztahuje pouze na parametry, ať už počtem nebo typem, pokud chceš vracet více různých typů, ale zároveň ponechat parametry, tak nemáš jinou možnost, než  vracet object a následně si to přetypovat na co chces nebo vracet nějakou struktůru/třídu a k ní přidat funkce pro převod do int/string apod.

pokud to budeš mít genericky jak jsem uvedl, tak C# není tak pohodlnej jako třeba C++ pro genericitu a kolikrát je to problém přetypovat na co přesně chceš.. v tom případu jak jsem uvedl, tak genricita je v pořádku, ale pokud chceš vrátit něco jinýho než, než je ten generickej typ třídy, tak máš problém (jde to, ale je to trochu delší kód)

jinak v tom případě jak si uvedl...

int a = neco["CESTA/POLOZKA1"]
string b = neco["CESTA/POLOZKA2"]
if  (neco["CESTA/POLOZKA3"] == 12)

tak nejlepší by bylo nastavit to na int a v tom případě, kde to vracíš jako string, používat ještě ToString() .. tohle se běžně používá, protože tím jak si to napsal, to nikdy neuděláš

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
host
~ Anonymní uživatel
17 příspěvků
20. 8. 2012   #7
-
0
-

#5 liborb
S tím souhlasím. Shodou okolností jsem tenhle semestr měl předmět "Formální logiky a překladače" a je to tak.

Nahlásit jako SPAM
IP: 88.102.250.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 36 hostů

Podobná vlákna

Přetížení operátoru ^ — založil TauWich

Pretizeni [] .... — založil janek

Přetížení — založil Marik

Přetížení [] — založil koudiss

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý