18. maj 2008 - 20:31Der er
33 kommentarer og 2 løsninger
Variabel der bliver sat ved anvendelse frem for oprettelse?
Hej eksperter!
Her kommer et lidt specielt spørgsmål, så jeg vil gøre mig umage med beskrivelser og forklaringer...
Jeg har brug for at have en variabel, der bliver sat ved anvendelse frem for oprettelse. Den letteste forklaring på anvendelsen er nok et eksempel:
class Test() { public int A = 1; public int B = 2; public int C = A+B; // Der skal vel stå noget specielt her? } // Tests Console.WriteLine(C.ToString); // 3 A = 2; Console.WriteLine(C.ToString); // 4 og IKKE 3!
// Klasse class Klasse { public int A = 2; public int B = 3;
public enum Type{ Add, Multiply }; private Type type;
public int C { get{ switch(type) { case Type.Add: return A+B; case Type.Multiply: return A*B; default: throw new System.ArgumentException("Ingen type"); } } }
public Klasse(Type type) { this.type = type; } }
class program{
public static void Main(){
// Instanser Klasse Test1 = new Klasse(Klasse.Type.Add); Klasse Test2 = new Klasse(Klasse.Type.Multiply);
Hvad skulle formålet være med at lægge C udenfor? Det antal forskellige matematiske udtryk for C, der skal være mulige, inkluderer du vel bare i klassen. Hvis det skal være muligt at ændre klassens type senere, så kan du bare gøre det muligt.
Ellers hedder det delegates, hvis du skal have C til at kalde en ekstern metode
Synes godt om
Slettet bruger
18. maj 2008 - 21:43#17
Altså... Jeg roder med lidt primitiv AI, og programmet skal således kunne sende forskellige beskeder til brugeren alt efter en række faktorer. De mulige beskeder oprettes som instanser af klassen (i tilfældene her 'Klasse') og har så hver i sær en række conditions for at kunne sendes. Disse conditions afgøres ved værdien af C, der i AI-programmet er af typen bool og netop beregnet ud fra AI'ens faktorer (og forskellig fra besked til besked).
Hvis du ikke vil have beregningen af C til at være placeret i klassen, kan du anvende en delegate, som du giver med i constructoren, som så, når C bliver brugt bliver kaldt.
Noget i retning af: class Test { private Func<int,int,int> cImplementation; public Test(Func<int,int,int> cImplementation) { this.cImplementation = cImplementation; }
public int A { get;set;}
public int B { get;set;}
public int C { get { return cImplementation(A,B); } } }
Så kan du f.eks. lave en klasse test, hvor C returnerer summen af A og B ved at skrive: Test t1 = new Test((a,b) => a + b); (koden er ikke testet, men idéen skulle være tydelig nok)
Er det dét du har brug for ?
Synes godt om
Slettet bruger
18. maj 2008 - 22:38#19
Hmm... Måske. Hvad så hvis jeg har f.eks. 10 forskellige variable, jeg skal sammenligne?
Delegates er ikke en dårlig ide. Men brug anonyme delegates.
public delegate int Func(); class Test() { public int A = 1; public int B = 2; public Func C;
public Test() { C = new Func(delegate(){return A + B;});
//eller: C = new Func(delegate(){return A * B;}); } }
Hvis du har 10 forskellige variabler:
int result = new Func(delegate(){return A + B + C + D...osv;});
Synes godt om
Slettet bruger
19. maj 2008 - 12:35#21
10 hænder er bedre end 8 :) Jep, det er lige det, jeg skal bruge... Jeg tester det lige, når jeg har ædt mit mysli.
Synes godt om
Slettet bruger
19. maj 2008 - 15:40#22
SKAL Func() stå uden for klassen?
Synes godt om
Slettet bruger
19. maj 2008 - 15:42#23
Og et andet spørgsmål: Hvordan lavet jeg en parameter til delegate'ns conditions?
Synes godt om
Slettet bruger
19. maj 2008 - 16:18#24
Okay, jeg har ikke brug for en parameter, så her kommer et mere relevant spørgsmål: C bliver af typen Func og ikke int. Hvordan får jeg returneret den resulterende int?
SkrivPaaSkaerm("Resulterende int: C.ToString()); virker som sagt IKKE.
Synes godt om
Slettet bruger
19. maj 2008 - 16:18#25
* RETTET *
Okay, jeg har ikke brug for en parameter alligevel, så her kommer et mere relevant spørgsmål: C bliver af typen Func og ikke int. Hvordan får jeg returneret den resulterende int?
C er nu en delegate, så den kan kaldes som en metode. Alt efter hvor mange parametre du har valgt; kan du så kalde C: Console.WriteLine(C()); eller Console.WriteLine(C(A,B));
Synes godt om
Slettet bruger
19. maj 2008 - 18:18#27
så C = new Func(delegate(int omgkeklol){return A * B + omgkeklol;}); Console.WriteLine(C(27).ToString()); giver A*B+27?
C er af typen Func. en instans af typen Func kan kaldes som en metode og returnere en int.
Først skal Func-typen deklareres. Dette skal gøres uden for klassen: public delegate int Func();
Inde i klassen har du en property du har kaldt C, som er af typen Func: public Func C;
et eller andet sted sætter du C til at være en instans af typen Func. F.eks. i konstruktøren: C = new Func(delegate(){return A + B;});
For at kalde C og få den til at returnere en integer gør du følgende: int myInt = C();
Du kalder altså din property som om den var en metode. Når du kalder en delegate returnerer den typen som specificeres i deklarationen, i dette tilfælde en int.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.