Sto creando un software in C#. Sto usando una classe astratta, Instruction
, che ha questi pezzi di codice:Risoluzione del problema "Chiamata metodo virtuale in costruttore"
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);
}
}
e
public virtual Instruction GetRealInstruction(InstructionSet instructionSet, ExpressionElement argument) {
throw new NotImplementedException("Real instruction not implemented. Instruction type: " + GetType());
}
Così ReSharper mi dice che alla linea marcata che sto 'chiamando un metodo virtuale nel costruttore' e questo è cattivo. Capisco la cosa sull'ordine in cui sono chiamati i costruttori. Tutte le sostituzioni del metodo GetRealInstruction
simile a questa:
public override Instruction GetRealInstruction(InstructionSet instructionSet, ExpressionElement argument) {
return new GoInstruction(instructionSet, argument);
}
Così non dipendono da alcun dato nella classe; restituiscono solo qualcosa che dipende dal tipo derivato. (quindi l'ordine del costruttore non li influenza).
Quindi, dovrei ignorarlo? Preferirei di no; così qualcuno potrebbe mostrarmi come potrei evitare questo avvertimento?
Non riesco a utilizzare i delegati in modo ordinato perché il metodo GetRealInstruction
ha un sovraccarico in più.
Ho dimenticato di menzionare, ma un altro vantaggio in questo modo è che nel tuo caso eviti la necessità di avere il metodo base virtuale, piuttosto che astratto, quindi ottieni un controllo in fase di compilazione invece di lanciare un'eccezione (come menzionato @TarasDzyoba) . – Richard
Questo è molto ben pensato, grazie. Alla fine ho evitato questo problema in un altro modo, ma questa è un'ottima soluzione per il futuro. –