Inkonsistenter Zugriff?



  • Hallo Leute, ich habe das Thema Klasse und Vererbung im Buch VC# 2008 durchgekaut, nun versuche ich eine eigene Klasse Mensch zu entwickeln. Dabei will ich eine private Enumeration innerhalb der Klasse für die Haarfarbe machen, doch ich kriege jedesmal diese Fehlermeldung:

    [b]Inkonsistenter Zugriff: Eigenschaftentyp "Mensch.Mensch.Haarfarbe" ist weniger zugreifbar als Eigenschaft "Mensch.Mensch.Haar"[/b

    Hier der Quellcode mit den relevanten Stellen für das Problem:

    public class Mensch
        {
            private Haarfarbe haar;
    
            public Haarfarbe Haar
            {
                get
                {
                    return this.haar;
                }
                set
                {
                    value = haar;
                }
            }
    
            private enum Haarfarbe
            {
                Braun,
                Blond,
                Rot,
                Schwarz
            }
        }
    

    Wenn ich die Enumerationsdefinition public mache, dann habe ich keine Probleme, doch das möchte ich wenn es geht vermeiden.

    mfG CAres91


  • Administrator

    CAres91 schrieb:

    Wenn ich die Enumerationsdefinition public mache, dann habe ich keine Probleme, doch das möchte ich wenn es geht vermeiden.

    Das macht aber ziemlich wenig Sinn. Wie soll man dann von ausserhalb der Klasse eine Haarfarbe setzen oder überprüfen, was für eine Haarfarbe gesetzt ist, wenn man gar keinen Zugriff auf die Enumeration bekommt?

    Grüssli



  • Hmm, also in dem Buch, dass ich habe wurde innerhalb einer Klasse eine private Klasse definiert. Das Beispiel wurde zwar nicht komplett erläutert, aber ich meine das müsste gehen. Ich möchte das Konzept der geschachtelten Typen nicht nur auf Klassen anwenden, sonder auch auf Enumerationen, Strukturen, ... . Wenn es geht auch so wie im Buch mit private.



  • Wie soll man denn der Eigenschaft "Haar" etwas zuweisen, wenn man gar nicht weiß, was man zuweisen kann?



  • Mein Versuch:

    namespace Zweibeiner
    {
    
      private enum Haarfarbe 
      { 
        Braun, 
        Blond, 
        Rot, 
        Schwarz 
      } 
    
      public class Mensch
      {
        private Haarfarbe haar;
    
        public Haarfarbe Haar
        {
          get { return this.haar; }
          set { value = haar; }
        }
      }
    
    }
    

    Der Typ Haarfarbe in Deinen zwei Eigenschaften Deiner Klasse Mensch kann nicht innerhalb der Klasse Mensch definiert sein, sondern muss ausserhalb der Klasse definiert werden. Das ist die Loesung.
    Etwas aufwendiger wird es noch wenn der Typ Haarfarbe nicht im gleichen Namespace liegt wie die Klasse Mensch, aber das war auch nicht dass Problem. 😉
    Ich hoffe es hilft Dir weiter.



  • Die Fragen wurden noch nicht geklärt:
    Wie können nun verwendende Klassen die Haarfarbe überprüfen/setzen?



  • Ein Vorher/Nachher-Vergleich des Codes ergibt, dass der Typ Haarfarbe jetzt aus der Klasse Mensch herausgenommen wurde, so sind Haarfarbe und Mensch nun auf gleicher Zugriffsebene, innerhalb des Namespace Zweibeiner. Vorher war das ja nicht der Fall.

    namespace Zweibeiner
    {
    
      public enum Haarfarbe { Braun, Blond, Rot, Schwarz } 
    
      public class Mensch
      {
        private Haarfarbe haar;
    
        public Haarfarbe Haar
        {
          get { return this.haar; }
          set { value = haar; }
        }
      }
    
      public static void Main(string[] args)
      {
        Mensch Ich = new Mensch();
    
        Ich.Haar = Haarfarbe.Rot;
    
        if (Ich.Haar == Haarfarbe.Rot)
          Console.Writeln("Meine Haarfarbe ist rot.");
        else
          Console.Writeln("Meine Haarfarbe ist alles ausser rot.");
      }
    
    }
    

Anmelden zum Antworten