私はC#でソフトウェアを作っています。だから、ReSharperのは、「コンストラクタで仮想メソッドを呼び出す」マークされた行で私はと言われます'コンストラクタ内の仮想メソッド呼び出し'の問題を解決する
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);
}
}
と
public virtual Instruction GetRealInstruction(InstructionSet instructionSet, ExpressionElement argument) {
throw new NotImplementedException("Real instruction not implemented. Instruction type: " + GetType());
}
:私は、コードのこれらのビットを持つ抽象クラス、Instruction
を、使用していますこれは悪いことです。私は、コンストラクタが呼び出される順序についてのことを理解しています。 GetRealInstruction
方法のすべてのオーバーライドは、次のようになります。
public override Instruction GetRealInstruction(InstructionSet instructionSet, ExpressionElement argument) {
return new GoInstruction(instructionSet, argument);
}
そこで彼らは、クラス内の任意のデータには依存しません。派生した型に依存するものを返すだけです。 (コンストラクタの順序はそれらに影響しません)。
私は無視する必要がありますか?私はむしろないと思います;誰も私にこの警告を避ける方法を教えてもらえますか?
GetRealInstruction
メソッドにオーバーロードがもう1つあるため、代理人をきれいに使用することはできません。
私は言及を忘れましたが、この方法のもう一つの利点は、あなたの場合、抽象メソッドではなく仮想メソッドを仮想化する必要がなくなるため、例外をスローするのではなくコンパイル時のチェックを得ることです(@TarasDzyobaが述べたように) 。 – Richard
これは非常によく考えられています、ありがとうございます。私は最終的にこの問題を別の方法で回避しましたが、これは将来的には非常に良い解決策です。 –