Laden...

enum als Parameter im Konstruktor

Erstellt von SGT_BOB vor 18 Jahren Letzter Beitrag vor 18 Jahren 12.914 Views
S
SGT_BOB Themenstarter:in
125 Beiträge seit 2005
vor 18 Jahren
enum als Parameter im Konstruktor

Hallo Leute.

Vielleicht ist es ein triviales Problem, aber ich häng damit ziemlich in der Luft.

Ich würde gern meinem Konstruktor ein enum übergeben.


public class Character
{
private string Name = null;
private enum Type {PC, NPC, EN};
private uint HPCur = 0;
private uint HPMax = 0;
private uint MPCur = 0;
private uint MPMax = 0;
private uint Level = 0;
private uint EXPCur = 0;
private uint EXPNxtLvl = 0;
private uint Strength = 0;
private uint Dexterity= 0;


public Character()
{

}

public Character(string Name, Type type, uint hpcur, uint hpmax, uint mpcur, uint mpmax, uint level, uint expcur, uint expnxtlvl, uint strength, uint dexterity)
{
this.Name = Name;
this.Type = type;
this.HPCur = hpcur;
this.HPMax = hpmax;
this.MPCur = mpcur;
this.MPMax = mpmax;
this.Level = level;
this.EXPCur = expcur;
this.EXPNxtLvl = expnxtlvl;
this.Strength = strength;
this.Dexterity = dexterity;
}
}

Leider bekomme ich folgende Fehlermeldung beim Aufruf des Konstruktors:
_C:\Dokumente und Einstellungen\olli\Eigene Dateien\Visual Studio Projects\GameTests\Character\CharacterClass.cs(29): Inconsistent accessibility: parameter type 'Game.Character.Type' is less accessible than method 'Game.Character.Character(string, Game.Character.Type, uint, uint, uint, uint, uint, uint, uint, uint, uint)' _

Was genau läuft hier falsch? Es ist schon spät und vielleicht sehe ich den Wald vor lauter Bäumen nicht.

SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

23 Beiträge seit 2005
vor 18 Jahren

Hi,

dein Enum ist Private und dein Konstruktor ist Public.

MfG

mipper

Same shit different day !

S
SGT_BOB Themenstarter:in
125 Beiträge seit 2005
vor 18 Jahren

Das ist schon richtig so. Da sich beide in der selben Klasse befinden, sollte das auch kein Problem darstellen. Bei den anderen Klassenmembern hab ich ja auch deswegen keine Problem. Das Problem liegt irgendwo anders.

Danke trotzdem.

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

23 Beiträge seit 2005
vor 18 Jahren

Hi

Du rufst den Konstruktor doch ausserhalb der Klasse Character auf und dabei muss du einen Typ übergeben.
Und genau auf diese kannst du nicht zugreifen wegen dem private.

Bei den anderen Variablen ist das kein Problem da du nicht auf diese von ausserhalb zugreifst. Du übergibst dem Kontruktor ja lediglich uints und strings und die sind allgemein zugängliche Klassen.

Oder sehe ich das jetzt falsch ?

MfG
Mipper

Same shit different day !

S
SGT_BOB Themenstarter:in
125 Beiträge seit 2005
vor 18 Jahren

Ich verlier allmählich den Durchblick.

Ja. Der Konstruktor soll außerhalb aufgerufen werden. Aber mein Problem entsteht ja schon beim Erstellen des Projektes. Also ohne Aufruf des Konstruktors.

Ich versuche hier erstmal nur eine *.dll zu erstellen, auf die ich später zugreifen will. Aber ich rufe den Konstruktor hier noch nicht auf.

Auch wenn ich den public setze, will das nicht so ganz. 🙁

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

X
2.051 Beiträge seit 2004
vor 18 Jahren

    //
    public class Character
    {
        private string Name = null;
        public enum Type { PC, NPC, EN };    // <===== Publilc daraus machen
....


        public Character()
        {

        }

        public Character(string Name, 
                Character.Type type,  // <== Damit wird es eindeutig
                uint hpcur, uint hpmax, uint mpcur, uint mpmax, uint level, uint expcur, uint expnxtlvl, uint strength, uint dexterity)
        {
            this.Name = Name;
            this.Type = type;   // Und das geht gar nicht, weil Type hier Typ ist und keine Variable

....
        }
    }
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo SGT_BOB,

Aber ich rufe den Konstruktor hier noch nicht auf.

es macht aber keinen Sinn, einen public Konstruktor zu definieren, denn man nie und nirgendwo (außerhalb der Klasse) benutzen kann. Der Compiler ist hier vorausschauend. Die Fehlermeldung geht voll ok. Also entweder beides public machen oder beides private. Dann - wie schon meine Vorredner geschrieben haben - geht es.

herbivore

379 Beiträge seit 2004
vor 18 Jahren

Kann mich den anderen nur anschließen.

Du willst ja deinen Konstruktor von Außen ansprechen, aber von Außen ist dein Enum überhaupt nicht bekannt. Das erkennt das VS und bringt dir die entsprechende Fehlermeldung 😉

S
SGT_BOB Themenstarter:in
125 Beiträge seit 2005
vor 18 Jahren

Ihr hattet wohl recht. =)

Habs jetzt so gemacht:

Character ch = new Character("Hero",Game.Character.Type.PC, ...); 

Wie kann ich mir jetzt den Type ausgeben lassen? Alà Console.WriteLine z.B.

Hab in der Character-Klasse Methoden deklariert z.B.:

		public string GetName()
		{
			return this.Name;
		}

Wie würde das jetzt für den enum-Wert gehen?

Ich komm mir vor wie ein blutiger Anfänger X(

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

N
4.644 Beiträge seit 2004
vor 18 Jahren

Suchst Du:
Enum.GetName(...);
Enum.GetNames(...);
?

S
SGT_BOB Themenstarter:in
125 Beiträge seit 2005
vor 18 Jahren

Suchst Du:
Enum.GetName(...);
Enum.GetNames(...);
?

Kann schon sein. Aber wie komm ich da jetzt dran.

Ich erstelle mir in meiner Testklasse eine Instanz von Character. Auf deren Member kann ich über die öffentlichen Methoden zugreifen (siehe Beispiel oben)

Wenn ich jetzt aber über die der Klasse Character auf das enum Type zugreifen möchte, wie soll das geschehen? Da es jetzt ja public ist sollte der Zugriff doch auch direkt gehen, oder? Geht aber nicht...

Sorry Leute ich glaub ich schlaf zu wenig. 😉

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

M
115 Beiträge seit 2003
vor 18 Jahren

Wie wärs damit:

    
//Deklaration außerhalb der Klasse
public enum CharacterType { PC, NPC, EN }

//Deine Character-Klasse vereinfacht...
public class Character
{

//Mit dieser Variable wird innerhalb der Klasse gearbeitet..
private CharacterType _charType;

//Konstruktor mit CharacterType Parameter
public Character(CharacterType Type)
{
   this._charType=Type;
}

//Öffentliche Eigenschaft Lese/Schreibzugriff um 
//von außerhalb an den CaracterType zu kommen

public CharacterType Type
{
   get{return this._charType;}
   set{this._charType=value;}
}

}

   

Benutzung (z.B. )

    
Character myChar = new Character(CharacterType.PC);

if(myChar.Type==CharacterType.PC)
{
   //Mach was....
}

   

Ps: Warum wird value als c# keyword nicht eingefärbt?

Gernot Melichar

S
SGT_BOB Themenstarter:in
125 Beiträge seit 2005
vor 18 Jahren

@Meli:

1.000.000.000.000.000 Dank an dich. Genau das war mein Problem. 😁 Geht halt doch alles irgendwie, auch wenn's über Umwege geregelt werden muss. 8)

Danke für eure Hilfe...

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

P
939 Beiträge seit 2003
vor 18 Jahren

Meli:
Ps: Warum wird value als c# keyword nicht eingefärbt?

Weil es kein Keyword ist. Value ist nur eine, im bestimmten Kontext (Setter), vordefinierte Variable. An anderen Stellen kann value frei als Bezeichner verwendet werden. Was man natürlich trotzdem tunlichst unterlassen sollte. Versteht sich von selbst. 😉

Gruss
Pulpapex