membre interne dans une interface

J'ai une liste d'objets implémentant une interface, et une liste de l'interface:

public interface IAM
{
    int ID { get; set; }
    void Save();
}

public class concreteIAM : IAM
{
     public int ID { get; set; }
     internal void Save(){
     //save the object
     }

    //other staff for this particular class
}

public class MyList : List<IAM>
{
    public void Save()
    {
        foreach (IAM iam in this)
        {
            iam.Save();
        }
    }

    //other staff for this particular class
}

Le code ne compile pas car le compilateur a besoin de tous les membres interface publique.

internal void Save(){

Mais je ne veux pas permettre à l'provenant de l'extérieur de ma DLL pour enregistrer le ConcreteIAM, il ne doit être enregistré par le MyList.

Toute façon de le faire?

Mise à jour#1: Salut à tous, merci pour les réponses, mais aucune n'est exactement ce dont j'ai besoin:

L'interface doit être publique, parce que c'est la signature du client à partir de l'extérieur de la dll à utiliser, avec ID et d'autres propriétés que je n'ai pas pris la peine d'écrire dans l'exemple de garder les choses simples.

Andrew, je ne pense pas que la solution est de créer une usine pour créer un autre objet qui contiendra les IAM membres + Enregistrer. Je suis encore à penser... d'autres idées?

  • merci pour les réponses, mais aucune n'est exactement ce dont j'ai besoin: L'interface doit être publique, parce que c'est la signature du client à partir de l'extérieur de la dll à utiliser, avec ID et d'autres propriétés que je n'ai pas pris la peine d'écrire dans l'exemple de garder les choses simples. Andrew, je ne pense pas que la solution est de créer une usine pour créer un autre objet qui contiendra les IAM membres + Enregistrer. Je suis encore à penser... d'autres idées?
  • Si vous voulez garder de la méthode d'enregistrement sur le concreteAM classe votre meilleur pari est probablement pour aller avec une classe de base abstraite, avec un intérieur abstrait méthode Save comme suggéré par Nathan W.
  • mieux vaut tard que jamais, mais cela peut aider: stackoverflow.com/a/18944374/492
InformationsquelleAutor | 2008-12-15