Tôi đang tạo một phần mềm trong C#. Tôi đang sử dụng một lớp trừu tượng, Instruction
, có những bit mã:Giải quyết sự cố 'Gọi phương thức ảo trong sự cố của người xây dựng'
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);
}
}
và
public virtual Instruction GetRealInstruction(InstructionSet instructionSet, ExpressionElement argument) {
throw new NotImplementedException("Real instruction not implemented. Instruction type: " + GetType());
}
Vì vậy Resharper nói với tôi rằng tại dòng rõ rệt Tôi 'gọi một phương thức ảo trong constructor' và điều này là xấu. Tôi hiểu điều về thứ tự mà các nhà thầu được gọi. Tất cả các ghi đè của phương pháp GetRealInstruction
trông như thế này:
public override Instruction GetRealInstruction(InstructionSet instructionSet, ExpressionElement argument) {
return new GoInstruction(instructionSet, argument);
}
Vì vậy, họ không phụ thuộc vào bất kỳ dữ liệu trong lớp; họ chỉ trả lại một cái gì đó mà phụ thuộc vào loại có nguồn gốc. (do đó thứ tự khởi tạo không ảnh hưởng đến chúng).
Vì vậy, tôi có nên bỏ qua nó không? Tôi không muốn; vì vậy bất cứ ai có thể chỉ cho tôi làm thế nào tôi có thể tránh cảnh báo này?
Tôi không thể sử dụng đại biểu gọn gàng vì phương pháp GetRealInstruction
có thêm một tình trạng quá tải.
Tôi quên đề cập đến, nhưng lợi ích khác của cách này là trong trường hợp của bạn, bạn không cần phải có phương pháp cơ sở ảo, thay vì trừu tượng, do đó bạn có được kiểm tra biên dịch thay vì ném một ngoại lệ (như @TarasDzyoba đã đề cập) . – Richard
Đó là suy nghĩ rất tốt, cảm ơn bạn. Cuối cùng tôi đã tránh được vấn đề này theo cách khác, nhưng đây là một giải pháp rất tốt trong tương lai. –