Machen Sie Eigenschaften/Methoden sichtbar zu einer Klasse versteckt auf andere
-
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 User
s, und schafft Sie als notwendig.
Ich habe zwei Probleme mit dem User
Klasse:
- Jeder kann erstellen eine Instanz einer
User
.Ich will nur dieServer
Klasse in der Lage sein, dies zu tun. - Wenn ein Benutzer (der Sache
User
beschreibt), ändert seinen Namen (oder andere Informationen wie kam Kanäle), dieServer
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.
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.