2009-07-20 3 views
1

Je reçois le compilateur avertissement suivant:Est-ce que l'héritage cache vraiment les méthodes?

'Resources.Foo.GetType()' hides inherited member 'object.GetType()'. Use the new keyword if hiding was intended. Resources.NET\Resources\Class1.cs 123 20 Resources 

pour cette (très simplifié) Code:

public interface IFoo 
{ 
    int GetType(); 
    string GetDisplayName(); 
} 

public class Foo : IFoo 
{ 
    public int GetType() { return 3; } *** Warning: points to here (line 123)*** 
    public string GetDisplayName() { return "Foo"; } 
} 

Note, ce que je ne comprends pas pourquoi la fonction GetDisplayName() ne sont pas un avertissement. Je suis clairement en train de négliger quelque chose.

J'ai contourné Stack Overflow et googlé cette erreur et il semble s'appliquer à l'héritage de classe, pas d'interfaces. Je suis vraiment confus pourquoi cela serait déclenché pour l'interface (qui définit ses méthodes comme virtuelles).

Merci d'avance pour la perspicacité.

+0

Wow, vous êtes tous incroyables.4 réponses de qualité en moins de 4 minutes! Comment choisit-on la meilleure réponse? Je pense que les liens l'ont fait pour moi, même si c'était proche. Merci encore à tous! – teleball

Répondre

10

La méthode GetType est définie sur la classe System.Object, qui est la classe de base ultime de toutes les classes de la structure.

Cette méthode est utilisée pour obtenir le Type de l'instance en cours d'exécution, et je pense que vous n'avez pas l'intention de la redéfinir (vous avez un type de retour int).

Je vous suggère de renommer la méthode en GetFooType ou autre chose, ou implémentez votre interface explicitly pour éviter les problèmes d'exécution.

2

Il ne se plaint pas de votre implémentation de l'interface, mais plutôt de votre réimplémentation de GetType() qui est déjà sur "object" - dont Foo hérite automatiquement. "Object" n'a pas de méthode GetDisplayName et ne soulève donc aucune plainte pour celui-ci. Essayez de renommer la méthode ou d'ajouter le "nouveau" modificateur si vous voulez vraiment masquer object.GetType() bien que ce ne soit pas recommandé.

3

Tous les types dans .NET dérivent de System.Object. System.Object définit déjà une méthode nommée GetType.

Si vous définissez une autre méthode 'GetType' dans votre classe et si quelqu'un crée un objet de votre classe, ils ne peuvent jamais appeler la méthode GetType mise à disposition par System.Object. C'est la raison pour laquelle vous obtenez l'avertissement selon lequel 'GetType' masque la méthode définie dans System.Object. Vous n'obtenez pas cet avertissement pour GetDisplayName car System.Object (ou n'importe quelle classe parente) ne définit pas cette méthode.

Je vous recommande de changer le nom de votre méthode en quelque chose d'autre. En général, les développeurs .NET s'attendent à ce que l'appel de méthode GetType fasse référence à l'implémentation de System.Object.

4

Il fait référence à votre méthode masquant GetType de l'objet, pas de votre interface. Puisque votre classe hérite de l'objet et implémente IFoo, et tous deux fournissent une méthode GetType, par implicitement implémentant l'interface, vous allez masquer le GetType hérité de l'objet. Si vous voulez toujours votre méthode d'interface pour appeler GetType, vous pouvez le mettre en œuvre explicitement plutôt dans Foo:

int IFoo.GetType() 
{ 
    return 3; 
} 
-1

classe System.Object a déjà la méthode GetType()

vous devez utiliser la nouvelle ou remplacer le mot-clé pour résoudre ce problème

Questions connexes