2008-09-26 10 views
6

मैं राइनोमोक्स के साथ कुछ मजाक कर रहा हूं और इसके लिए यह आवश्यक है कि मॉक किए गए तरीकों को वर्चुअल बनाया जाए। यह ठीक है सिवाय इसके कि हमारे पास कस्टम फ्रेमवर्क है जिसमें वे विधियां हैं जिन्हें मैं मॉक करना चाहता हूं जिन्हें वर्तमान में वर्चुअल के रूप में चिह्नित नहीं किया गया है।विधि वर्चुअल बनाने के खतरे क्या हैं?

मैं इन विधियों को आभासी बनाने के साथ किसी भी समस्या का सामना नहीं कर सकता लेकिन मैं सोच रहा था कि विधियों को वर्चुअल बनाने के कुछ संभावित खतरे क्या हैं जिन्हें मुझे देखना चाहिए?

+1

मैंने राइनो का कभी भी उपयोग नहीं किया है, इसलिए मुझे उत्सुकता है कि इसकी आवश्यकता क्यों है। किसी को भी समझाने की परवाह है? –

+0

मुझे लगता है कि राइनो एक ही प्रकार का उपयोग करके इंटरफ़ेस को नकल करने के लिए विधियों को ओवरराइड करता है लेकिन नकली व्यवहार। –

उत्तर

8

वास्तव में यह समस्याएं खड़ी कर सकता विधि ओवरराइड करने के लिए नहीं बनाया गया है, तो और किसी को ओवरराइड करता है। विशेष रूप से, किसी कन्स्ट्रक्टर से वर्चुअल विधि को कभी भी कॉल न करें। पर विचार करें:

class Base { 
    public Base() { 
     InitializeComponent(); 
    } 
    protected virtual void InitializeComponent() { 
     ... 
    } 
} 

class Derived : Base { 
    private Button button1; 
    public Derived() : base() { 
     button1 = new Button(); 
    } 
    protected override void InitializeComponent() { 
     button1.Text = "I'm gonna throw a null reference exception" 
    } 
} 

व्युत्पन्न वर्ग से पता है कि आभासी विधि कॉल अपने InitializeComponent विधि में पहले अपने स्वयं के निर्माता की एक पंक्ति समाप्त हो गया है परिणाम होगा बुलाया जा रहा है नहीं हो सकता।

4
  • आप उन है कि अपने आभासी तरीकों को ओवरराइड है, तो आप कोड को तोड़ने के बिना फिर से उन्हें सील नहीं कर सकते।
  • किसी भी आभासी तरीकों आप से निर्माता व्युत्पन्न कार्यान्वयन करने के लिए नीचे गिर सकता है कहते हैं और अगर वे आधार विधि कॉल नहीं करते हैं और निर्माता इस पर निर्भर करता है, वस्तु किसी अमान्य स्थिति
संबंधित मुद्दे