2009-09-05 8 views
31

J'ai cette interface:Comment rendre une méthode privée dans une interface?

public interface IValidationCRUD 
{ 
    public ICRUDValidation IsValid(object obj); 
    private void AddError(ICRUDError error); 
} 

Mais quand je l'utilise (Implémenter l'interface, la génération automatique de code), je reçois ceci:

public class LanguageVAL : IValidationCRUD 
{ 
    public ICRUDValidation IsValid(object obj) 
    { 
     throw new System.NotImplementedException(); 
    } 

    public void AddError(ICRUDError error) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

La méthode AddError est publique et non privée que je voulait.

Comment puis-je changer cela?

+0

Je suis surpris que cela compile, je suis sûr quand j'ai été sur 'pilote automatique' taper une interface et ajouté 'public' sans penser que le compilateur s'est plaint à moi. – Kirschstein

+1

Il ne compile pas. Vous ne pouvez pas avoir de méthodes privées dans une interface, et vous n'êtes même pas autorisé à spécifier public car cela est implicite pour tous les membres d'une interface. –

+0

Je viens d'écrire l'interface et après essayé de l'utiliser sur l'autre classe. Visual Studio ne le compile pas. – SmartStart

Répondre

36

Une interface ne peut avoir que des méthodes publiques. Vous pouvez envisager d'utiliser une classe de base abstraite avec une méthode abstraite protégée AddError pour cela. La classe de base peut ensuite implémenter l'interface IValidationCRUD, mais seulement après avoir supprimé la méthode privée.

comme ceci:

public interface IValidationCRUD 
{ 
    ICRUDValidation IsValid(object obj); 
} 

public abstract class ValidationCRUDBase: IValidationCRUD { 
    public abstract ICRUDValidation IsValid(object obj); 
    protected abstract void AddError(ICRUDError error); 
} 
+1

Une interface (bien formée) ne peut avoir que des méthodes publiques. Fait intéressant, le CLR prend en charge les constantes, les champs et même les constructeurs statiques (type) pour les interfaces. C'est parce qu'une interface est implémentée comme n'importe quelle autre définition de type. –

+0

Les champs sur les interfaces ne sont pas conformes CLS, non? – Botz3000

+1

Correct. Les interfaces compatibles CLS ne peuvent pas contenir de membres statiques car les langues telles que C# ne peuvent pas les définir ou y accéder. –

27

Un député fait dans le cadre d'une interface n'a aucun sens. Une interface est là pour définir un ensemble de méthodes, un rôle, un objet doit toujours être implémenté. D'autre part, les méthodes privées sont des détails de mise en œuvre, non destinés à la consommation publique.

+7

Vous ne pouvez pas. La spécification d'un modificateur d'accès (privé ou public) entraîne une erreur de compilation. – JulianR

+0

Merci, ça sonne une cloche. –

+0

Les interfaces doivent être considérées comme un mécanisme permettant de faire respecter le contrat qu'une classe fait envers les utilisateurs de la classe. Il garantit que les méthodes X, Y, Z, ... seront toujours disponibles pour être utilisées par les utilisateurs externes de la classe. Ce qui est ennuyeux, c'est que parfois, vous voulez vous épargner la peine d'implémenter des méthodes auxquelles les programmeurs de la classe doivent avoir accès lors de l'implémentation de la classe elle-même.Vous pouvez le faire en héritant d'une autre classe concrète ou abstraite, mais comme C# ne supporte pas l'héritage multiple, vous ne pouvez pas mélanger et faire correspondre, vous aurez donc besoin de recourir à la composition. –

1

La règle d'une interface:

Le CLR permet également une interface pour contenir statique méthodes, champs statiques, constantes et constructeurs statiques. Cependant, une interface compatible CLS ne doit avoir aucun de ces membres statiques car certains langages de programmation ne peuvent pas les définir ou y accéder. En fait, C# empêche une interface de définir des membres statiques. En outre, le CLR ne permet pas à une interface de contenir des champs d'instance ou des constructeurs d'instance.

Ce sont les règles d'une interface et vous ne pouvez rien faire sur ce :)

Ce ne sont pas autorisés

interface IIValidationCRUD 
{ 
    static ICRUDValidation IsValid(object obj); //error 
} 

interface IIValidationCRUD 
{ 
    public ICRUDValidation IsValid(object obj); //error 
} 
0

Avez-vous pensé à utiliser:

void IValidationCRUD.AddError(ICRUDError error) 
    { 
     throw new System.NotImplementedException(); 
    } 

Au lieu de

public void AddError(ICRUDError error) 
{ 
    throw new System.NotImplementedException(); 
} 

Désolé de vous inscrire trop tard.

3

ne est pas un __gVirt_NP_NN_NNPS<__ scénario valable en cas réel, mais vous pouvez réaliser grâce à la mise en œuvre explicite de l'interface

interface Itest 
{ 
     void functiona(); 
     void functionb(); 
} 
class child : Itest 
{ 
    public void functiona() 
    { 
    } 
    void Itest.functionb() 
    { 
    } 
} 

ici functionb() est explicitement implimented donc si vous avez créé l'objet d'un enfant de la classe que ne vous functionb (

Questions connexes