je code suivant. Et j'ai besoin de cacher une fonction de l'interface.Interface partiellement protégée mais sans classe abstraite
interface IOne
{
int FunctionOne();
}
interface ITwo
{
double FunctionTwo();
}
interface IInterfaceToImplement : IOne, ITwo
{
void AFunctionToImplement();
}
public abstract MyBaseClass : TheVeryHeavyBaseClass<T, IInterfaceToImplement>, IInterfaceToImplement
{
public abstract void AFunctionToImplement(); // How to force this one to be protected?
public virtual int FunctionOne() { return 0; }
public virtual double FunctionTwo() { return 0.0; }
}
public MyConcreteClass : MyBaseClass
{
public override void AFunctionToImplement(); // How to force this one to be protected?
}
Comme vous pouvez le voir, j'ai une classe de base. Et j'ai besoin que le AFunctionToImplement()
soit caché. Ai-je un mauvais design de cours? Des suggestions sur la façon de protéger la fonction d'être appelé?
EDIT. Réponse à la question Pavel Minaev dans les commentaires.
J'ai besoin chaque classe concrète de mettre en œuvre la liste des fonctions de IInterfaceToImplement. J'ai aussi besoin de chaque classe concrète pour pouvoir stocker des classes de type IInterfaceToImplement. Il s'agit d'un stockage de données arborescente. Chaque 'branche' du stockage doit effectuer les mêmes opérations que toute autre branche. Mais personne d'autre que la 'racine' et les autres 'braches' ne doivent appeler ces opérations.
EDIT2 Ma solution.
Merci Matthew Abbott et Pavel Minaev. J'ai finalement réalisé mon problème - c'est le cerveau. :)
Non, je plaisante. :) Le problème est - j'ai pensé aux classes de racine et de branche de la même branche. Maintenant, je comprends - la racine ne devrait pas implémenter IInterfaceToImplement
. Voir la solution:
public class MyRootClass : IOne, ITwo
{
private IInterfaceToImplement internalData = new MyConcreteClass();
public int FunctionOne() { return this.internalData.FunctionOne(); }
public double FunctionTwo() { return this.internalData.FunctionTwo(); }
}
Qu'est-ce que vous essayez précisément d'atteindre? Les interfaces sont des contrats publics par définition, cela n'a tout simplement pas de sens d'avoir une définition d'interface privée. Il est parfois logique d'avoir l'implémentation particulière semi-privée, mais comme on peut toujours obtenir la référence typée par interface au même objet et appeler les méthodes d'interface, une implémentation d'interface ne peut jamais être vraiment privée non plus. Alors ... qu'est-ce que tu essayes de faire? –