limite la méthode à appeler uniquement par une classe particulière
Je veux une méthode particulière dans une classe à seulement accessible par une classe particulière. Par exemple:
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
}
}
Est qu'il ya un mot-clé ou l'attribut que je peux utiliser pour faire appliquer le présent?
Mise à JOUR:
En raison de la complexité du système et des contraintes de temps, j'avais besoin d'un faible impact de la solution. Et je voulais quelque chose pour indiquer au moment de la compilation que LimitedAccess() ne peut pas être utilisé. J'ai confiance Jon Skeet la réponse c'est exactement ce que j'avais demandé n'a pas pu être fait en C#.
La question et de Jon réponses sont bonnes pour ceux qui à travers cela plus tard. Et le fait que cette conception des odeurs peut espérer veer personne pour le choix de quelque chose comme ce que souhaité une solution.
Comme mentionné dans un commentaire, le C# ami conversation est utile de lire si vous essayez de résoudre une situation similaire.
Que pour ma solution particulière: "pourquoi A contient B de la logique" (demandé par @sysexpand dans les commentaires). C'est le hic. B.Func()
a été appelé dans l'ensemble du système sur lequel je travaille, mais elle est principalement exploité sur un singleton de A
. Donc, ce que j'ai fait a été de passer B
's Func()
en A
et de faire A.LimitedAccess()
privé. Il y avait quelques autres détails à contourner, comme il en a toujours, mais j'ai un faible impact de la solution qui m'a donné des erreurs de compilation sur les appelants à A.LimitedAccess()
.
Merci pour la discussion.
source d'informationauteur jltrem
Vous devez vous connecter pour publier un commentaire.
Pas. La seule chose que vous pourriez faire serait de faire
LimitedAccess
une méthode privée, et le nid de la classeB
au sein de la classeA
.(Je suis en supposant que vous voulez tous les cours dans la même assemblée. Sinon, vous pourriez vous mettre
A
etB
dans la même assemblée, etC
dans une autre assemblée, et de faireLimitedAccess
uninternal
méthode.)En supposant que vous ne voulez restreindre l'accès à des méthodes et des variables pour une spécifiques exemple, vous pouvez obtenir cet effet en utilisant une interface. Cependant, il n'a pas empêcher quelqu'un de la création de leur propre instance de la classe, à quel point ils auront un accès complet à cette instance.
C'est à l'encontre de la programmation orientée objet les meilleures pratiques pour faire une telle conception. Les méthodes des classes ne sont pas censés être protégés d'être appelé.
Si votre conception exige un contrôle sur l'appel d'une méthode, puis le contrôle doit être exercé par les tests les arguments de l'appelant est autorisé à faire un appel à "connaître" le mot magique à passer comme argument.
C'est peut-être une solution de contournement.
Utiliser le Système.Moment de l'exécution.CompilerServices et puis, vous pouvez vérifier le Nom de la fonction d'appel et/ou le fichier, dans lequel la fonction d'appel est défini. Si vous avez une classe par fichier, le nom de fichier peut être un substitude pour le nom de la classe. Vérifier et bloquer l'appel.