Diskuze: Přetížení operátora a více metod v --- ?

C# .NET .NET (C# a Visual Basic) Přetížení operátora a více metod v --- ? American English version English version

Avatar
Cencek
Člen
Avatar
Cencek:

Takže potřebuju si upravit program tak aby kód fungoval tak že po napsání následujícího kódu se mi do stringu actions v instanci p1 zapíše: Utok, Obrana. Nějaké návrhy jak si mám přetížit operátora << ? a jak by měla obecně vypadat struktura kódu, tím myslím jaké třídy a metody?

Player p1=new Player();
      p1<<Akce.Utok;
      p1<<Akce.Obranaů

Díky za odpověď!

 
Odpovědět 11.10.2014 23:48
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Cencek
Jan Vargovský:

Operátor << nelze v C# přetížit (a ani v něm neexistuje btw) viz http://msdn.microsoft.com/…edha89s.aspx

 
Nahoru Odpovědět 11.10.2014 23:57
Avatar
Cencek
Člen
Avatar
 
Nahoru Odpovědět 12.10.2014 0:01
Avatar
Jiří Gracík
Redaktor
Avatar
Odpovídá na Cencek
Jiří Gracík:

Existuje, ale tady není důvod ho použít. Každopádně to nemění nic na tom, že ten kód výše bude s největší nesmysl. Pokud máš objekt p1 a v něm vlastnost actions, pak do ní zapíšeš jednoduše takto:

p1.actions = "Utok, Obrana";
Nahoru Odpovědět 12.10.2014 0:06
Creating websites is awesome till you see the result in another browser ...
Avatar
Cencek
Člen
Avatar
Odpovídá na Jiří Gracík
Cencek:

To vím ale toto má sloužit jako procvičení přetěžování a bůhví čeho a nemůžu tomu přijít na kloub ... ten kód konečný by měl vypdat takto

Player p1=new Player();
      p1<<Akce.Utok;
      p1<<Akce.Pohyb;
      p1<<Akce.Obrana;
      .
      .
      .
      Console.WriteLine(p1);
Editováno 12.10.2014 0:10
 
Nahoru Odpovědět 12.10.2014 0:08
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Cencek
Jan Vargovský:

Dobře, sorry, jde to. Ale nejde to tak, jak si ty představuješ. První typ je třída a druhá je int. Jestli je typ tvé Akce enum, tak by se to dalo využít, ale... nedělal bych to.

Když bys měl třídu X, tak můžeš přepsat danou operaci takto:

public static X operator <<(X x, int n)
{
    ...
    return x;
}

Jenže volání nebude probíhat jak si myslíš, protože když bys měl instanci x, tak bys to stejně musel volat jako:

x <<= (int)Akce.Attack;

A uvnitř toho operátoru bys měl velkej switch/řadu podmínek pro volání každé z těch akcí (čti metod).

... Teď ještě čtu co si fakt chtěl a ono je to stejné, akorát bys místo volání metody přidával ke stringu hodnotu.

Radši si udělej nějakou metodu, využij params a udělej něco takového.

public void AddAction(params Akce[] akce)
{
    actions += string.Join(", ", akce);
}

a volání pak na instanci x:

x.AddAction(Akce.Att, Akce.Def, Akce.Def);

EDIT: Rada na závěr, nemíchej angličtinu s češtinou :) (Ano já to taky udělal, ale protože jsem použil část tvého a přidal k němu můj.

Editováno 12.10.2014 1:42
 
Nahoru Odpovědět 12.10.2014 1:40
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

Ještě k tomu, že ten operátor neexistuje: koukám na seriály a holt jsem zapomněl na bitové posuny no.

 
Nahoru Odpovědět 12.10.2014 1:44
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.