Announcement

Collapse
No announcement yet.

Eigene Klasse und Verfügbarkeit

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Eigene Klasse und Verfügbarkeit

    Ich habe eine eigen Klasse Benutzer erstellt.

    Wenn ich jetzt im Programm eine neue Instanz erstelle (Dim b as new Benutzer()) habe ich auch zugriff auf die eigenschaften usw. aber immer nur dort, wo ich die Instanz erstellt habe (z.B. Im Formular).

    Wie Erreiche ich, dass ich programmweiten Zugriff auf die Klasse habe?
    Bekomme dann immer die Fehlermeldung dass Sie nicht deklariert wurde.

    Ziel ist es, bei Programmstart (login) einige Benutzerdaten in einer neuen Instanz der Klasse Benutzer mitzuführen (ID,Name usw.) um dann immer wieder Zugriff auf diese Daten zu haben ( z.b.: mybenutzer.id)
    Zuletzt editiert von daribla; 31.05.2010, 15:31.

  • #2
    "Programmweiter Zugriff" gehört sich normalerweise nicht.

    Es gehört zum Gültigkeitsbereich von Variablen. Jede Variable ist nur dort bekannt, wo sie deklariert wird (nicht dort, wo sie initialisiert wird). Wenn eine Instanz nicht nur in einem Formular bekannt sein soll, sondern auch in einem anderen, musst du eben eine Referenz darauf übergeben. Beispiel:

    1. Deklariere im Unterformular eine passende Variable (nur deklarieren!).
    2. Deklariere eine public-Methode, die eine Variable dieses Typs ByRef entgegennimmt und der Variablen von Punkt 1 diesen Wert zuweist.
    3. Vom ersten Formular aus wird diese Methode aufgerufen.

    Es gibt (wie fast immer) noch viele andere Wege, aber damit sollte der Grundgedanke klar sein. Jürgen

    Comment


    • #3
      Da gäbe es dann aber noch die globalen Variablen. Wollte aber wegen der Übersichtlichkeit bei Klassen bleiben. Müßte dann sowas wie ne globale Klasse sein.
      Zuletzt editiert von Jürgen Thomas; 31.05.2010, 16:15. Reason: Komplett-Zitat entfernt

      Comment


      • #4
        Ich hatte ja zurückhaltend formuliert:
        "Programmweiter Zugriff" gehört sich normalerweise nicht.
        Es lässt sich über eine globale Variable, eine statische Klasse oder eine Singleton-Instanz regeln (VB ist hinsichtlich globaler Variablen großzügiger als C#). Aber es widerspricht eigentlich dem OOP-Konzept und sollte deshalb vermieden werden. Jürgen

        Comment


        • #5
          Gloable Klassen sind pfui. Allerdings ist dieses Ziel sind nicht so einfach zu erreichen. Ich würde sagen für Sachen die wirklich von globaler Bedeutung sind sind nimmst Du eine Shared Klasse. Das sollte den static Klassen in C# entsprechen.
          Aber versuche wirklich diese so wenig wie möglich zu verwenden. Je globaler alles ist, desto schlechter ist es zu warten und zu lesen.

          Comment


          • #6
            Wenn ich dann beim Login im Code des Loginfester die Klasse instanziere und die Werte zuweise habe ich aberin einem anderen Formular immer noch nicht den zugriff auf die Klassenmember. Nicht mal auf die Klasse, da VS meldet, dass z.B. mybenutzer nicht deklariert wurde.

            Comment


            • #7
              Deshalb musst du Deklaration und Instanziierung unterscheiden: Die Deklaration gehört in die globale oder Shared- oder Singleton-Klasse, die Instanziierung erfolgt vom Login-Formular aus über diese Klasse.

              Gleichzeitig musst du natürlich auch den Zugriff über Public usw. sicherstellen.

              Jürgen

              Comment


              • #8
                Originally posted by Jürgen Thomas View Post
                Deshalb musst du Deklaration und Instanziierung unterscheiden: Die Deklaration gehört in die globale oder Shared- oder Singleton-Klasse, die Instanziierung erfolgt vom Login-Formular aus über diese Klasse.

                Gleichzeitig musst du natürlich auch den Zugriff über Public usw. sicherstellen.

                Jürgen
                Ich hatte einfach eine neue Klasse angelegt. Wo finde ich denn die globale Klasse?

                Comment


                • #9
                  Jede Klasse die Du als static (C#)/shared (VB.NET) kennzeichnest ist eigentlich direkt global und kann von allen anderen, die ihren Namespace importieren, benutzt werden.

                  In Deinem Fall würde ich so etwas machen. Ich schreibs mal in C#, weil ich VB.NET nur lesenderweise beherrsche

                  [highlight=c#]
                  public class UserInformation
                  {
                  public int Id { get; set; }
                  public String UserName { get; set; }
                  public String EMail { get; set; }

                  //weiter User Eigenschaften
                  }

                  public static String UserManagement
                  {
                  private static UserInformation _userInformation;
                  private static UserDatabase _userDb; //Der eigentliche Zugriff auf die Benutzerdatenbank/Rechteverwaltung

                  public static UserManagement()
                  {
                  _userDb = new UserDatabase();
                  _userInformation = null;
                  }

                  public static UserInformation LoginUser(String userName, String password)
                  {
                  //Pseudocode

                  if(_userDb.LoginUser(userName, password)
                  userInformation = new UserInformation() { UserName = _userDb.GetUserId(userName), ... }; //restliche Eigenschaften auslesen

                  return _userInformation;
                  }

                  public static void LogOutCurrentUser()
                  {
                  if(UserIsLoggedIn)
                  _userDb.LogOutUser(_userInformation.UserName);

                  _userInformation = null;

                  }

                  public static bool UserIsLoggedIn { get { return _userInformation != null; } }

                  public static UserInformation UserInformation { get { return _userInformation; } }
                  }
                  [/highlight]

                  Verwenden kannst Du das dann überall im Programm so:

                  [highlight=c#]
                  UserManagement.LoginUser("heinz","1234");

                  if(UserIsLoggedIn)
                  Console.WriteLine(UserManagement.UserInformation.E Mail)
                  else
                  Console.WriteLine("User could not be logged in");

                  UserManagement.LogOutCurrentUser();
                  Console.Write
                  [/highlight]

                  Comment


                  • #10
                    So hat's funktioniert, danke

                    Comment

                    Working...
                    X