Ich mache eine Software in C#. Ich verwende eine abstrakte Klasse, Instruction
, dass diese Bit-Code hat:Lösung der 'virtuellen Methodenaufruf im Konstruktor' Problem
protected Instruction(InstructionSet instructionSet, ExpressionElement newArgument,
bool newDoesUseArgument, int newDefaultArgument, int newCostInBytes, bool newDoesUseRealInstruction) {
//Some stuff
if (DoesUseRealInstruction) {
//The warning appears here.
RealInstruction = GetRealInstruction(instructionSet, Argument);
}
}
und
public virtual Instruction GetRealInstruction(InstructionSet instructionSet, ExpressionElement argument) {
throw new NotImplementedException("Real instruction not implemented. Instruction type: " + GetType());
}
So ReSharper mir sagt, dass ich an der markierten Linie bin ‚eine virtuelle Methode in Konstruktor aufrufen‘ und das ist schlecht. Ich verstehe die Sache über die Reihenfolge, in der die Konstruktoren aufgerufen werden. Alle Überschreibungen des GetRealInstruction
Methode wie folgt aussehen:
public override Instruction GetRealInstruction(InstructionSet instructionSet, ExpressionElement argument) {
return new GoInstruction(instructionSet, argument);
}
Also nicht auf alle Daten in der Klasse, die sie hängen; Sie geben nur etwas zurück, das vom abgeleiteten Typ abhängt. (also betrifft die Reihenfolge der Konstruktoren sie nicht).
Also, sollte ich es ignorieren? Ich würde lieber nicht; Könnte mir jemand zeigen, wie ich diese Warnung vermeiden könnte?
Ich kann Delegaten nicht sauber verwenden, weil die GetRealInstruction
Methode eine weitere Überlast hat.
Ich habe vergessen zu erwähnen, aber ein weiterer Vorteil dieses Weges ist, dass Sie in Ihrem Fall vermeiden, dass die Basismethode virtuell statt abstrakt sein muss, deshalb erhalten Sie Kompilierzeitprüfung, anstatt eine Ausnahme zu werfen (wie @TarasDzyoba erwähnt) . – Richard
Das ist sehr gut durchdacht, danke. Letztendlich habe ich dieses Problem auf andere Weise vermieden, aber das ist eine sehr gute Lösung für die Zukunft. –