Ich möchte eine bestimmte Methode in einer Klasse nur für eine bestimmte Klasse zugänglich sein. Zum Beispiel:Limit-Methode nur von einer bestimmten Klasse aufgerufen werden
public class A
{
public void LimitedAccess() {}
public void FullAccess() {}
}
public class B
{
public void Func()
{
A a = new A();
a.LimitedAccess(); // want to be able to call this only from class B
}
}
public class C
{
public void Func()
{
A a = new A();
a.FullAccess(); // want to be able to call this method
a.LimitedAccess(); // but want this to fail compile
}
}
Gibt es ein Schlüsselwort oder Attribut, das ich verwenden kann, um dies zu erzwingen?
UPDATE:
Aufgrund bestehenden Systemkomplexität und Zeitdruck, ich brauchte eine geringe Auswirkung Lösung. Und ich wollte etwas zur Kompilierzeit angeben, dass LimitedAccess() nicht verwendet werden konnte. Ich vertraue Jon Skeets Antwort, dass genau das, wonach ich gefragt hatte, nicht in C# erledigt werden konnte.
Die Frage und Jons Antwort sind gut für diejenigen, die später darauf stoßen. Und die Tatsache, dass dieses Design riecht, kann hoffentlich niemanden davon abbringen, sich für etwas wie diese als Lösung zu entscheiden.
Wie in einem Kommentar erwähnt, ist die C# friend Konversation nützlich, wenn Sie versuchen, eine ähnliche Situation zu lösen.
Wie für meine besondere Lösung: "Warum würde A die Logik von B enthalten" (gefragt von @sysexpand in Kommentaren). Das ist der Haken. B.Func()
wurde während des gesamten Systems, an dem ich arbeite, aufgerufen, aber es wurde hauptsächlich mit einem Singleton von A
betrieben. Also, was ich am Ende getan habe, war B
Func()
in A
zu verschieben und A.LimitedAccess()
privat zu machen. Es gab ein paar andere Details, um zu umgehen, wie es immer gibt, aber ich habe eine Low-Impact-Lösung, die mir Kompilierungsfehler bei Anrufern A.LimitedAccess()
.
Danke für die Diskussion.
Warum möchten Sie dies tun? –
Ich habe eine große Klasse "A", die weitgehend in einem System verwendet wird. Die Klasse "B" hat andere Abhängigkeiten, hat aber den Standard/besten Weg, B.LimitedAccess() zu verwenden. Ich möchte mit 'B.Func()' erzwingen wann immer möglich. – jltrem
siehe http://stackoverflow.com/questions/203616/why-does-c-sharp-not-provide-the-c-style-friend-keyword Sie sollten "LimitedAccess" als intern markieren und Missbrauch durch Code feststellen Rezension. – Yaur