Soll ich ignorieren InterfaceMethodsShouldBeCallableByChildTypes für WPF-Code generiert?
Frage
Wenn FxCop 1,36 für eine WPF-Anwendung mit einem einzigen Fenster verwenden, das noch geändert werden muss, erhalte ich die InterfaceMethodsShouldBeCallableByChildTypes Fehler mit folgenden Angaben:
Target : #System.Windows.Markup.IComponentConnector.Connect(System.Int32,System.Object) (IntrospectionTargetMember)
Resolution : "Make 'MainWindow' sealed (a breaking change if
this class has previously shipped), implement the method
non-explicitly, or implement a new method that exposes
the functionality of 'IComponentConnector.Connect(int,
object)' and is visible to derived classes."
Help : http://msdn2.microsoft.com/library/ms182153(VS.90).aspx (String)
Category : Microsoft.Design (String)
CheckId : CA1033 (String)
RuleFile : Design Rules (String)
Info : "Explicit method implementations are defined with private
accessibility. Classes that derive from classes with
explicit method implementations and choose to re-declare
them on the class will not be able to call into the
base class implementation unless the base class has
provided an alternate method with appropriate accessibility.
When overriding a base class method that has been hidden
by explicit interface implementation, in order to call
into the base class implementation, a derived class
must cast the base pointer to the relevant interface.
When calling through this reference, however, the
derived class implementation will actually be invoked,
resulting in recursion and an eventual stack overflow."
Created : 08/12/2008 22:26:37 (DateTime)
LastSeen : 08/12/2008 22:41:05 (DateTime)
Status : Active (MessageStatus)
Fix Category : NonBreaking (FixCategories)
}
Sollte dies einfach ignoriert werden?
Lösung
es ignoriert, ist dieses Standard-Code, der in jeder WPF-Anwendung ist und Sie nicht sehen, beklagen die Menschen über Netto-IComponentConnector.Connect in der Lage zu nennen von abgeleiteten Klassen -. So ist es wahrscheinlich sicher
Generell denke ich, sollten Sie FxCop Ausgabe als Vorschläge zu behandeln, die sorgfältig abgewogen werden müssen, ich habe in der Vergangenheit viele schlechte Ratschläge von FxCop bekam.
Andere Tipps
Abhängig von, was Sie erwarten ein inheriter zu tun.
Wenn Sie diese Klasse nicht erwartet vererbt wird, dann sollte es verschlossen werden und das Problem verschwindet.
Wenn Sie es erwarten, dann vererbt werden Sie die Fähigkeit der erbenden Klasse nehmen die Interface-Methoden außer Kraft zu setzen und sie noch nennen (das heißt base.methodname()
). Wenn das Ihre Absicht ist, dann können Sie die Warnung ignorieren.
Das ist jedoch nicht die erwartete Verhalten für vererbbare Klassen, so dass Sie die Schnittstelle öffentlich aussetzen sollen (das heißt eine implizite Schnittstelle statt einer expliziten Schnittstelle).