Avatar billede j_jorgensen Nybegynder
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
Avatar billede davidfossil Nybegynder
31. maj 2005 - 16:46 #1
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; }
}
Avatar billede j_jorgensen Nybegynder
31. maj 2005 - 16:50 #2
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...
Avatar billede davidfossil Nybegynder
31. maj 2005 - 16:51 #3
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; }
}
Avatar billede dr_chaos Nybegynder
31. maj 2005 - 16:53 #4
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;}
        }
    }
Avatar billede dr_chaos Nybegynder
31. maj 2005 - 16:54 #5
her sættes f.eks. suit på denne måde
Card c = new Card();
c.Suit = SUIT.Diamonds;
Avatar billede davidfossil Nybegynder
31. maj 2005 - 16:56 #6
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; }
    }
  }
}
Avatar billede dr_chaos Nybegynder
31. maj 2005 - 16:56 #7
du kan bruge

public enum GAMESTATUS
{
    paused ,
    running
}
private enum _gamestatus;
public GAMESTATUS Gamestatus
{
get {return _gamestatus;}
set {_gamestatus = value;}
}
Avatar billede davidfossil Nybegynder
31. maj 2005 - 16:57 #8
hov - "gamestatus" skal så lige rettes til "GameStatus" to steder i Game klassen.
Avatar billede davidfossil Nybegynder
31. maj 2005 - 17:00 #9
Ad. 16:56:50

public enum GameStatus ... kan så lægges inden for Game klassen hvis du ønsker...
Avatar billede dr_chaos Nybegynder
31. maj 2005 - 17:00 #10
hvis din klasse hedder Game sætter du game status på denne måde:
Game g = new Game();
g.Gamestatus = game.GAMESTATUS.running
Avatar billede nielle Nybegynder
31. maj 2005 - 17:13 #11
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; }
}
Avatar billede nielle Nybegynder
31. maj 2005 - 17:14 #12
... pointen er at du ikke kan definere din type som private og så samtidigt bruge den som returtype på en public funktion.
Avatar billede j_jorgensen Nybegynder
31. maj 2005 - 17:18 #13
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.
Avatar billede j_jorgensen Nybegynder
31. maj 2005 - 17:20 #14
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?
Avatar billede nielle Nybegynder
31. maj 2005 - 17:20 #15
Ret til "public enum _gamestatus;"  ... det er det eneste der skal til.
Avatar billede nielle Nybegynder
31. maj 2005 - 17:24 #16
@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.
Avatar billede dr_chaos Nybegynder
31. maj 2005 - 17:34 #17
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
Avatar billede j_jorgensen Nybegynder
31. maj 2005 - 17:43 #18
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?
Avatar billede nielle Nybegynder
31. maj 2005 - 18:07 #19
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.
Avatar billede dr_chaos Nybegynder
31. maj 2005 - 22:35 #20
svar :)
Avatar billede davidfossil Nybegynder
31. maj 2005 - 23:05 #21
bummelum
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester