Machen Sie Eigenschaften/Methoden sichtbar zu einer Klasse versteckt auf andere

StackOverflow https://stackoverflow.com/questions/550268

  •  23-08-2019
  •  | 
  •  

Frage

Ich habe eine Klasse Server die Gespräche zu einer Verbindung zum server für IRC.Es enthält eine Liste der bekannten Users, und schafft Sie als notwendig.

Ich habe zwei Probleme mit dem User Klasse:

  1. Jeder kann erstellen eine Instanz einer User.Ich will nur die Server Klasse in der Lage sein, dies zu tun.
  2. Wenn ein Benutzer (der Sache User beschreibt), ändert seinen Namen (oder andere Informationen wie kam Kanäle), die Server Klasse können ändern es sich selbst.Aber auch andere Klassen können das auch!Ich möchte, dass andere Klassen von berühren Sie diese Informationen (wodurch Sie schreibgeschützt sind).

Wie kann ich das Problem lösen dieser beiden Probleme?In C++ kann es behoben werden, indem die friend Schlüsselwort und macht das Tor und setName (und so) privat.

Gibt es eine C# - Schlüsselwort können, eine bestimmte Methode sein, zugänglich von einer bestimmten Klasse?Dies würde mein problem lösen.

War es hilfreich?

Lösung

Ehrlich gesagt finde ich die friend Zugriff auf, aus der Sie stammt aus C++ werden symptomatisch für schlechtes design.Du bist besser dran Befestigung Ihres Designs.

Für einen start, wer kümmert sich wirklich, wenn es jemand schafft ein Benutzer?Ist es wirklich wichtig?Ich Frage dies, weil es scheint, dass wir manchmal Programmierer verfangen sich Gedanken über Dinge, die einfach nicht passieren wird, oder, wenn Sie es tun, es spielt keine Rolle.

Wenn Sie wirklich wichtig ist, dann führen Sie einen der folgenden Schritte aus:

  • Make User interface.Server instanziieren können eine private Klasse, die Sie implementiert;oder
  • Die Benutzer die eine innere Klasse der Server mit keine öffentlichen Konstruktoren, so dass nur Server instanziieren können es.

Sichtbarkeit hacks (für die Freunde, die in C++ ein und Paket-Zugriff in Java sind beide gute Beispiele) sind einfach zu Fragen, für die Mühe und keine gute Idee.

Andere Tipps

Die nächsten in der .NET-Welt zu friend ist die internal Sichtbarkeit.

Beachten Sie, dass, wenn Ihr zwei-Klassen sind in separaten Assemblys, die Sie verwenden können, die InternalsVisibleTo Attribut zum ermöglichen eine Montage Sichtbarkeit der Interna der anderen.

Die Neugestaltung Ihrer Klassenhierarchie ist wahrscheinlich eine faire Lösung für dieses problem.Denn es klingt für mich wie das, was Sie wirklich brauchen, ist ein nur-Lesen-Benutzer-Klasse, wenn es existiert außerhalb der Server-Klasse.

Ich würde wahrscheinlich so etwas wie dies tun:

// An abstract base class. This is what I'd use outside the 
// Server class. It's abstract, so it can't be instantiated
// on its own, and it only has getters for the properties. 
public abstract class User
{
   protected User()
   {
   }

   public string Name { get;}
   // Other get-only properties
}

public class ServerUser : User
{
   public ServerUser()
   {
   }

   public string Name { get; set;}
   // Other properties. 
}

Dann müssen Sie die Server-Klasse erstellt ServerUser Klassen, Benutzer der Server-Klasse, um Eigenschaften zu ändern, die auf der ServerUser-Klassen (wie das ändern von Benutzernamen), sondern nur aussetzen Benutzer-Klassen, die außerhalb Welt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top