मैं सी # में एक सॉफ्टवेयर बना रहा हूं। मैं एक अमूर्त वर्ग, Instruction
, कोड की इन बिट्स है कि उपयोग कर रहा हूँ:'कन्स्ट्रक्टर में वर्चुअल विधि कॉल' समस्या को हल करना
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());
}
तो Resharper मुझसे कहता है कि चिह्नित लाइन पर मैं निर्माता में एक आभासी विधि बुला 'कर रहा हूँ और यह बुरा है। मैं उस क्रम के बारे में बात समझता हूं जिसमें रचनाकारों को बुलाया जाता है। GetRealInstruction
विधि के सभी ओवरराइड इस तरह दिखेगा:
public override Instruction GetRealInstruction(InstructionSet instructionSet, ExpressionElement argument) {
return new GoInstruction(instructionSet, argument);
}
तो वे कक्षा में किसी भी डेटा पर निर्भर नहीं है; वे सिर्फ कुछ लौटाते हैं जो व्युत्पन्न प्रकार पर निर्भर करता है। (इसलिए कन्स्ट्रक्टर ऑर्डर उन्हें प्रभावित नहीं करता है)।
तो, क्या मुझे इसे अनदेखा करना चाहिए? मै शायद नहीं; तो क्या कोई मुझे दिखा सकता है कि मैं इस चेतावनी से कैसे बच सकता हूं?
मैं प्रतिनिधियों का अच्छी तरह से उपयोग नहीं कर सकता क्योंकि GetRealInstruction
विधि में एक और अधिभार है।
मैं उल्लेख करना भूल गया था, लेकिन इस तरह का एक अन्य लाभ यह है कि आपके मामले में आप मूल विधि के बजाय आधार विधि वर्चुअल होने की आवश्यकता से बचते हैं, इसलिए आपको अपवाद फेंकने के बजाय संकलन-समय की जांच मिलती है (जैसा कि @TarasDzyoba उल्लेख किया गया है) । – Richard
यह बहुत अच्छा विचार है, धन्यवाद। अंत में मैंने इस समस्या से एक और तरीके से परहेज किया, लेकिन यह भविष्य में एक बहुत अच्छा समाधान है। –