2009-07-20 6 views
1

ich folgende Compiler Warnung bin immer:verberge wirklich Vererbung Methoden?

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

für diese (sehr vereinfacht) 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"; } 
} 

Hinweis, ich nicht bekommen, was ist, warum die GetDisplayName() Funktion nicht bekommt eine Warnung. Ich übersehe eindeutig etwas.

Ich habe Stack Overflow stocherte und googelte diesen Fehler und es scheint zu Klassenvererbung, nicht Schnittstellen gelten. Ich bin wirklich verwirrt, warum dies für die Schnittstelle (die ihre Methoden als virtuell definiert) ausgelöst werden würde.

Vielen Dank im Voraus für die Einsicht.

+0

Wow, Sie sind alle unglaublich.4 hochwertige Antworten in weniger als 4 Minuten! Wie wählt man die beste Antwort? Ich denke, die Links haben es für mich getan, obwohl es eng war. Danke euch allen nochmal! – teleball

Antwort

10

Die Methode GetType ist in der Klasse System.Object definiert, die die ultimative Basisklasse aller Klassen des Frameworks darstellt.

Diese Methode wird verwendet, um die Type der aktuellen Instanz in Laufzeit zu erhalten, und ich denke, dass Sie nicht beabsichtigen, es zu überschreiben (Sie haben einen Int-Rückgabetyp).

Ich empfehle Ihnen, die Methode in GetFooType oder etwas anderes umzubenennen, oder implementieren Sie Ihre Schnittstelle explicitly, um Laufzeitprobleme zu vermeiden.

2

Es beschwert sich nicht über Ihre Implementierung der Schnittstelle, sondern eher Ihre Reimplementierung von GetType(), die bereits auf "Objekt" - von dem Foo automatisch erbt. "Objekt" hat keine GetDisplayName-Methode und erhebt daher keine Beanstandung. Versuchen Sie, die Methode umzubenennen oder den Modifikator "new" hinzuzufügen, wenn Sie object.GetType() wirklich ausblenden möchten, obwohl dies nicht empfohlen wird.

3

Alle Typen in .NET stammen von System.Object.

System.Object definiert bereits eine Methode namens GetType. Wenn Sie eine andere Methode 'GetType' in Ihrer Klasse definieren und wenn jemand ein Objekt Ihrer Klasse erstellt, können Sie die GetType-Methode niemals von System.Object zur Verfügung stellen. Aus diesem Grund erhalten Sie die Warnung, dass 'GetType' die in System.Object definierte Methode verdeckt. Sie erhalten diese Warnung nicht für GetDisplayName, da System.Object (oder für jede andere übergeordnete Klasse) diese Methode nicht definiert.

Ich würde empfehlen, dass Sie den Methodennamen in etwas anderes ändern, da in der Regel .NET-Entwickler erwarten, dass sich der Aufruf der GetType-Methode auf die System.Object-Implementierung bezieht.

4

Es bezieht sich auf Ihre Methode zum Ausblenden GetType von Objekt, nicht von Ihrer Schnittstelle. Da Ihre Klasse Objekt erbt und implementiert IFoo, und beide bieten eine GetType Methode, durch implizit Implementieren der Schnittstelle werden Sie die GetType vererbt von Objekt verbergen. Wenn Sie noch Ihre Interface-Methode wollen GetType aufgerufen werden, können Sie implementieren es explizit statt in Foo:

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

System.Object-Klasse bereits die GetType() -Methode hat

Sie die neue verwenden sollten oder überschreiben Schlüsselwort, um dieses Problem zu lösen

Verwandte Themen