2010-11-26 8 views
2

Ich habe ein Problem mit FxCop und die Warnung: Abstract types should not have constructors.FxCop Abstrakte Typen sollten keine Konstruktoren haben, wenn keine neuen

Dies wird für eine Reihe von abstrakten Klassen angezeigt (möglicherweise alle, die ich nicht überprüft habe). Wenn ich schaue, haben die meisten von ihnen keine neue Methode, also nehme ich an, dass der Compiler eine Standardmethode hinzufügt. So ist es zu entfernen, füge ich einen privaten Standard-Konstruktor (Private Sub New()), dann bedeutet dies, die alle inherting Klassen nicht mit dem Fehler bauen: Class 'InheritingClass' has no accessible 'Sub New' and cannot be inherited.

Dies scheint seltsam, wie FxCop Anfragen kein öffentlicher Konstruktor, aber wenn ich entferne sie die Build schlägt fehl.

Antwort

6

Versuchen Sie stattdessen, einen geschützten parameterlosen Konstruktor der abstrakten Klasse hinzuzufügen.

Wenn Sie keinen Konstruktor bereitstellen, fügt der Compiler public parameterlos einen für Sie hinzu. Offensichtlich ist es für eine abstrakte Klasse nicht angemessen, öffentliche Konstruktoren zu haben, da sie effektiv sind. trotzdem geschützt - Konstruktoren auf abstrakte Typen können bestenfalls von Unterklassen aufgerufen werden (das ist der ganze Sinn eines abstrakten Typs - er kann ' Instanziiert werden "Vanille"). Dieser Designfehler ist es, was FxCop dazu bringt, sich zu beschweren.

Auf der anderen Seite war der Schritt, den Sie unternommen haben, um das Problem zu beheben, zu extrem; Klassen (abstrakt oder nicht) mit nur private Konstruktoren sind in der Praxis nicht unterklassierbar (außer durch eine verschachtelte Klasse) - es gibt keinen impliziten oder expliziten Konstruktoraufruf, der möglicherweise im Konstruktor einer abgeleiteten Klasse funktionieren könnte.

EDIT: Ich mag die Art und Weise this MSDN page es ausdrückt:

In the example above abstract type has a public constructor, which can confuse users. They see the public constructor, but do not understand why they are unable to create the type.

+0

Spot on, und die Erklärung war auch hilfreich. – themaninthesuitcase