2012-11-20 3 views
1

Je suis assez nouveau à C# alors pardonnez-moi si c'est une question stupide. Je rencontre une erreur mais je ne sais pas comment la résoudre. J'utilise Visual Studio 2010. J'ai déjà implémenté plusieurs correctifs de membres de la communauté mais des problèmes semblent persister.Modification des modificateurs d'accès solution de contournement

Il a commencé avec cette ligne de code

public class GClass1 : KeyedCollection<string, GClass2> 

Je m'a donné l'erreur

'GClass1' does not implement inherited abstract member 'System.Collections.ObjectModel.KeyedCollection<string,GClass2>.GetKeyForItem(GClass2)' 

D'après ce que je l'ai lu coul être résolu en mettant en œuvre le membre abstrait dans la classe héritée comme si

public class GClass1 : KeyedCollection<string, GClass2> 
{ 
    public override TKey GetKeyForItem(TItem item); 
    protected override void InsertItem(int index, TItem item) 
    { 
    TKey keyForItem = this.GetKeyForItem(item); 
    if (keyForItem != null) 
    { 
     this.AddKey(keyForItem, item); 
    } 
    base.InsertItem(index, item); 
} 

Cependant, cela m'a donné des erreurs en disant 'Le type ou le nom de l'espace de nom ne pouvait pas b e trouvé TKey/TItem n'a pas pu être trouvé. ' J'ai donc remplacé les types d'espace réservé.

Actuellement le code est

public class GClass1 : KeyedCollection<string, GClass2> 
{ 

    public override string GetKeyForItem(GClass2 item); 
    protected override void InsertItem(int index, GClass2 item) 
    { 
    string keyForItem = this.GetKeyForItem(item); 
    if (keyForItem != null) 
    { 
     this.AddKey(keyForItem, item); 
    } 
    base.InsertItem(index, item); 
} 

Je suis totalement oublié que GetKeyForItem est protégé. La nouvelle erreur m'indique que je ne peux pas changer les modificateurs d'accès en surchargeant System.Collections.ObjectModel.KeyedCollection.GetKeyForItem (GCl ass2).

Je reçois également une étrange erreur en disant « GClass1.GetKeyForItem (GClass2) » doit déclarer un corps parce qu'il est pas marqué abstraite, extern ou partielle »

Y a-t-il des solutions de contournement au problème de modificateur d'accès, et quelqu'un pourrait-il expliquer l'erreur «déclarer un corps parce qu'il n'est pas marqué»?

Merci!

+2

Je vous suggère de lire un bon livre sur C# et recommencer. Comme vous l'avez déjà expérimenté vous-même, ces solutions rapides ne mèneront qu'à plus de problèmes. –

Répondre

2

GetKeyForItem est protégée dans la classe abstraite de base, elle doit donc être protégée dans votre classe dérivée. (De plus, je suppose que vous voulez mettre en œuvre - qui est la source de votre deuxième erreur, parce que les méthodes doivent avoir un corps à moins qu'ils sont abstraits.)

Cela devrait compiler:

protected override string GetKeyForItem(GClass2 item) 
{ 
    throw new NotImplementedException(); 

    // to implement, you'd write "return item.SomePropertyOfGClass2;" 
} 
0

Le erreur 'GClass1.GetKeyForItem(GClass2)' must declare a body because it is not marked abstract, extern, or partial' signifie probablement que vous devez mettre en œuvre la méthode, pas simplement le déclarer dans votre classe. En fait, vous devez y ajouter un bloc de code

protected override string GetKeyForItem(GClass2 item) 
{ 
    // some code 
} 

même s'il ne fait rien.

2

Vous devez implémenter la méthode abstraite exactement telle qu'elle est définie. Si vous voulez que cette méthode soit accessible au public, au lieu d'avoir juste l'accessibilité protected il a défini, vous aurez besoin d'ajouter une nouvelle, distincte, méthode qui utilise:

public class GClass1 : KeyedCollection<string, GClass2> 
{ 
    protected override string GetKeyForItem(GClass2 item) 
    { 
     throw new NotImplementedException(); 
    } 

    public string GetKey(GClass2 item) 
    { 
     return GetKeyForItem(item); 
    } 
} 
Questions connexes