2008-11-30 7 views
2

J'ai une classe qui hérite d'un dictionnaire générique et un intefaceclasse hérite dictionnaire générique <string, IFoo> Interface et

public class MyDictionary: Dictionary<string, IFoo>, IMyDictionary 
{ 
} 

la question est que les consommateurs de cette classe sont à la recherche des »et .keys "Valeurs" propriétés de l'interface donc j'ai ajouté:

/// <summary> 
    /// 
    /// </summary> 
    ICollection<string> Keys { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    IEnumerable<IFoo> Values { get; } 

à l'interface.

Maintenant, la mise en œuvre doit avoir cela aussi, mais quand je les mettre en œuvre, je reçois cette erreur:

«Le mot-clé nouveau est nécessaire, car il cache des clés de propriété .. »

si ce dois-je faire. Dois-je ajouter un "nouveau" en face de ces propriétés get?

Répondre

5

Une autre option serait de changer les types de l'interface être:

public interface IMyDictionary 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    Dictionary<string, IFoo>.KeyCollection Keys { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    Dictionary<string, IFoo>.ValueCollection Values { get; } 
} 

De cette façon, l'interface est déjà mis en œuvre par le dictionnaire que vous évite d'avoir à mettre en œuvre les propriétés à nouveau, et il n'a pas cacher ou couvrir l'implémentation d'origine.

+0

Je reçois cette erreur: Erreur Accessibilité incohérente: type de propriété 'System.Collections.Generic.Dictionary .KeyCollection' est moins accessible que la propriété 'ClassLibrary1.IMyDictionary.Keys' –

+0

Fonctionne bien sur mon machine. Assurez-vous que IFoo est public aussi. –

+0

Et l'interface IMyDictionary aussi –

2

La raison est que les propriétés de vos clés et de vos valeurs masquent l'implémentation des propriétés keys et values ​​dans la classe Dictionary.

EDIT: Oui, tout ce que vous avez à faire est d'ajouter le nouveau mot-clé dans votre propriété. Donc, le code ressemblera à ceci:

class IFoo 
{ } 

interface MyDictionary 
{ 
    ICollection<string> Keys { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    IEnumerable<IFoo> Values { get; } 
} 

class IStuff : Dictionary<string, IFoo>, MyDictionary 
{ 
    #region MyDictionary Members 

    //Note the new keyword. 
    public new ICollection<string> Keys 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public new IEnumerable<IFoo> Values 
    { 
     get { throw new NotImplementedException(); } 
    } 

    #endregion 
} 

Je recommanderais quand même d'implémenter IDictionary.

+0

pouvez-vous me donner un exemple de code? – leora

+0

Je travaille dessus maintenant. –

4

La chaîne Dictionary <, IFoo > implémente l'interface IDictionary < TKey, TValue > qui fournit déjà les propriétés Keys et Values. Il ne devrait pas être nécessaire de créer vos propres propriétés, mais la façon de contourner l'avertissement du compilateur consiste à ajouter le mot-clé new au début de vos déclarations de propriété dans votre classe.

2

Vous pouvez également utiliser une implémentation d'interface explicite. De cette façon, si quelqu'un référence MyDictionary en utilisant l'interface IMyDictionary ils verront les méthodes et rien d'autre. Je recommande également d'implémenter IDictionary à la place. Sauf si vous souhaitez limiter l'utilisation aux clés et aux valeurs.

public class MyDictionary : Dictionary<string, IFoo>, IMyDictionary 
{ 
    ICollection<string> IMyDictionary.Keys 
    { 
     get { return Keys; } 
    } 

    IEnumerable<IFoo> IMyDictionary.Values 
    { 
     get { return Values; } 
    } 
} 
Questions connexes