2012-06-10 16 views
7

क्या मैं सही हूं कि एक विधि घोषित करना abstract स्वचालित रूप से इसे वर्चुअल बनाता है?सार तत्व वर्चुअल हैं?

वह सबक्लास में है, मैं इसे कई बार ओवरटाइड कर सकता हूं और रनटाइम पर, ऑब्जेक्ट के रनटाइम प्रकार से संबंधित विधि को कॉल किया जाएगा?

क्या एक सार गैर-वर्चुअल विधि घोषित करना संभव है? यही वह तरीका है जिसे एक गैर-सारणी उपखंड में लागू किया जाना चाहिए और इसे ओवरराइड नहीं किया जा सकता है?

+0

संभावित डुप्लिकेट [क्या प्रत्येक अमूर्त फ़ंक्शन वर्चुअल सी # में सामान्य है?] (Http://stackoverflow.com/questions/391557/is-every-abstract-function-virtual-in-c-in- सामान्य) –

उत्तर

8

हां, abstract methods are virtual परिभाषा के अनुसार; वे करने के लिए वास्तव में उपवर्गों द्वारा ओवरराइड किया जा क्रम में overridable होना चाहिए:

जब एक उदाहरण विधि घोषणा एक abstract संशोधक भी शामिल है, उस विधि एक सार विधि होना कहा जाता है। यद्यपि एक सार विधि भी आभासी विधि है, इसमें संशोधक virtual नहीं हो सकता है।

इसके विपरीत आप एक अमूर्त गैर-आभासी विधि घोषित नहीं कर सकते हैं, क्योंकि यदि आप कर सकते हैं, तो आपके पास एक ऐसी विधि होगी जिसे कार्यान्वित नहीं किया जा सकता है और इस प्रकार इसे कभी भी बेकार नहीं बनाया जा सकता है।

हालांकि, अगर आप एक वर्ग एक सार विधि को लागू लेकिन इसके कार्यान्वयन को संशोधित करने के लिए अपने उपवर्गों की अनुमति नहीं करना चाहते हैं, कि जहां sealed भूमिका शुरू होती है एक उदाहरण:।

abstract public class AbstractClass 
{ 
    abstract public void DoSomething(); 
} 

public class BaseClass : AbstractClass 
{ 
    public sealed override void DoSomething() 
    { 
     Console.WriteLine("Did something"); 
    } 
} 

सूचना है कि जब तक सार विधि (निहित) वर्चुअल है, कंक्रीट बेस क्लास में कार्यान्वयन गैर-वर्चुअल है (sealed कीवर्ड की वजह से)।

1

हां, वे आभासी हैं। अन्यथा आपके पास उनके लिए कार्यान्वयन लिखने का कोई तरीका नहीं होगा।

संबंधित मुद्दे