31. maj 2005 - 16:35
Der er
19 kommentarer og 2 løsninger
Bruge Enum som property
Hej igen folkens, her er endnu et C-sjap problem. Jeg har følgende enum/property (simplificeret for længdens skyld) private enum gamestatus { paused = 0, running = 1, } public enum Gamestatus { get {} set {} } ...spørgsmålet er bare hvad jeg skal fylde i get & set? det kan jeg nemlig ikke hitte ud af! Google kan tilsynelande ikke hjælpe mig, og heller ikke dokumentationen til frameworket :( Er jeg helt gal på den eller hva'? /JJ
Annonceindlæg fra Kommando
Ved ikke om jeg forstår dit spørgsmål helt, men jeg prøver: private enum gamestatus { paused = 0, running = 1, } private gamestatus gs; public gamestatus Gamestatus { get { return gs; } set { gs = value; } }
Det var nemlig også mit gæt - men der går den helt grasat med følgende fejl: } expected (ved get { ) og Invalid token ';' in class, struct, or interface member declaration og det er så ved return gs; Ved set-linjen får jeg: A namespace does not directly contain members such as fields or methods Meget underligt...
Med denne stump definerer du klassen enum: private enum ClassName { ... } "enum" bruges som keyword i stedet for "class", pga. den særlige syntaks. Er du sikker på at denne klasse skal være private? I så fald vil du fx ikke udefra kunne sætter "mitObject.Gamestatus = gamestatus.Paused;" ... Følgende er helt svarende til hvis du havde et member i form af en string eller int, som du gerne vil gøre synlig udefra, her blot med et object af klassen "gamestatus": private gamestatus gs; public gamestatus Gamestatus { get { return gs; } set { gs = value; } }
jeg har brugt denne klasse som benytte enums til kort i et pokerspil: public class Card { //enum med type på kort public enum SUIT { None, Diamonds, Hearts, Clubs, Spades } //enum med rank af kort public enum RANK { None, Ace, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King } //variabler defineres private RANK _rank; private SUIT _suit; //card konstruktør public Card() { } //card konstruktør med 2 overloads public Card(RANK rank, SUIT suit) { this._rank = rank; this._suit = suit; } //rank property public RANK Rank { get { return _rank; } set { _rank = value;} } //suit property public SUIT Suit { get { return _suit; } set { _suit = value;} } }
her sættes f.eks. suit på denne måde Card c = new Card(); c.Suit = SUIT.Diamonds;
jeg tror jeg ved hvad du gør galt - se dette eksempel: namespace Eksperten { public enum GameStatus { paused = 0, running = 1, } public class Game { private gamestatus gs; public gamestatus Gamestatus { get { return gs; } set { gs = value; } } } }
du kan bruge public enum GAMESTATUS { paused , running } private enum _gamestatus; public GAMESTATUS Gamestatus { get {return _gamestatus;} set {_gamestatus = value;} }
hov - "gamestatus" skal så lige rettes til "GameStatus" to steder i Game klassen.
Ad. 16:56:50 public enum GameStatus ... kan så lægges inden for Game klassen hvis du ønsker...
hvis din klasse hedder Game sætter du game status på denne måde: Game g = new Game(); g.Gamestatus = game.GAMESTATUS.running
Sådan her - med "public" foran enum gamestatus: public enum gamestatus { paused = 0, running = 1 } private gamestatus gs; public gamestatus Gamestatus { get { return gs; } set { gs = value; } }
... pointen er at du ikke kan definere din type som private og så samtidigt bruge den som returtype på en public funktion.
Sikke en masse eksempler :) dr_chaos - nederste eksempel virker ikke, den æder ikke "private enum _gamestatus;" Inconsistent accessibility: property type 'Maingame.gamestatus' is less accessible than property 'Maingame.Gamestatus' Det løber jeg ind i med davidfossils eksempler. Kan ikke rigtig overskue det. Dr_chaos - din besked fra 17.00.54 er præcist sådan jeg vil kunne kalde den.
Nielle, det fungerer ellers fint med andre variabler, har eksempelvis følgende: private Boolean hasmoved; public Boolean Hasmoved { get { return hasmoved; } set { hasmoved = value; } } Som fungerer fint nok. Hvordan adskiller de sig fra hinanden?
Ret til "public enum _gamestatus;" ... det er det eneste der skal til.
@31/05-2005 17:20:00> Nu er selve System.Boolean variabeltypen jo heller ikke erklæret som private. Og, det er netop det du gør når du skriver: private enum gamestatus { paused = 0, running = 1 } Her erklære du en ny _variabeltype_ samtidig med at du gør den private.
jeg har lige testet denne her: Game.cs: public class Game { public enum GAMESTATUS{running, paused} private GAMESTATUS _gamestatus; public Game() { // // TODO: Add constructor logic here // } public GAMESTATUS Gamestatus { get{return _gamestatus;} set{_gamestatus = value;} } } det her i main: Game g = new Game(); g.Gamestatus = Game.GAMESTATUS.running; System.Diagnostics.Debug.WriteLine(g.Gamestatus); det virker
Det ser godt ud - og jeg har også fået det til at virke...forstår ikke hvorfor det skal være så besværligt :-) Vil folk smide nogle svar?
Besværligt? Ikke specielt. Blot public, i stedet for private, foran din enum erklæring. Ingen point til mig tak, Doktoren var da vist først med løsningen.
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.