(1) स्टेटिक विधियों को ओवरराइड नहीं किया जा सकता है, तो वे आपके नए MockRoleService को वास्तविक सेवा के साथ स्वैप कर सकते हैं, हालांकि उन्हें 'नए' कीवर्ड का उपयोग करके छुपाया जा सकता है। अधिकतर ओवरराइडिंग विधियों का अर्थ है कि आप आधार प्रकार का संदर्भ देते हैं और व्युत्पन्न विधि को कॉल करना चाहते हैं। चूंकि स्थैतिक प्रकार का हिस्सा हैं और वे vtable लुकअप के अधीन नहीं हैं जो समझ में नहीं आता है।
उदा। स्टैटिक्स ऐसा नहीं कर सकते:
public class Foo {
public virtual void Bar() { ... }
}
public class Bar : Foo {
public override void Bar() { ... }
}
// use:
Foo foo = new Bar(); // make an instance
foo.Bar(); // calls Bar::Bar
क्योंकि स्टैटिक्स उदाहरणों पर काम नहीं करते, तो आप हमेशा Foo.Bar या Bar.Bar स्पष्ट रूप से निर्दिष्ट। तो ओवरराइडिंग का कोई मतलब नहीं है (इसे कोड में व्यक्त करने का प्रयास करें ...)।
(2) स्थिर तरीकों के लिए अलग-अलग उपयोग हैं। उदाहरण के लिए, इसका उपयोग सिंगलटन पैटर्न में एक प्रकार का एक उदाहरण प्राप्त करने के लिए किया जा रहा है। एक और उदाहरण 'स्थैतिक शून्य मुख्य' है, जो आपके कार्यक्रम में मुख्य पहुंच बिंदु है।
असल में आप उनका उपयोग करते हैं जब भी आप इसे उपयोग करने से पहले ऑब्जेक्ट इंस्टेंस नहीं बनाना चाहते हैं या नहीं बना सकते हैं। उदाहरण के लिए, जब स्थिर विधि वस्तु बनाता है।
[अद्यतन]
एक साधारण छुपा उदाहरण:
public class StaticTest
{
public static void Foo() { Console.WriteLine("Foo 1"); }
public static void Bar() { Console.WriteLine("Bar 1"); }
}
public class StaticTest2 : StaticTest
{
public new static void Foo() { Console.WriteLine("Foo 2"); }
public static void Some() { Foo(); Bar(); } // Will print Foo 2, Bar 1
}
public class TestStatic
{
static void Main(string[] args)
{
StaticTest2.Foo();
StaticTest2.Some();
StaticTest.Foo();
Console.ReadLine();
}
}
ध्यान दें कि अगर आप कक्षाओं static
बनाने के लिए, यदि आप ऐसा नहीं कर सकते हैं। स्टेटिक वर्गों को object
से प्राप्त करना होगा।
इस और विरासत के बीच मुख्य अंतर यह है कि संकलक स्थिरता का उपयोग करते समय कॉल करने के लिए संकलित समय पर निर्धारित कर सकते हैं। यदि आपके पास ऑब्जेक्ट्स के उदाहरण हैं, तो आपको इसे रनटाइम पर करना होगा (जिसे एक vtable लुकअप कहा जाता है)।
नहीं, उन्हें ओवरराइड नहीं किया जा सकता है। वे वर्ग के साथ जुड़े हुए हैं, वस्तु के साथ नहीं। वास्तविक उपयोग के लिए –
: आप क्लास इंस्टेंस के बिना एक स्थिर विधि को कॉल कर सकते हैं। – Najzero
धन्यवाद। मैं समझता हूं [क्या एक स्थिर विधि है] (http://stackoverflow.com/a/4124118/2061309), स्लाक्स द्वारा दिया गया सबसे अच्छा उदाहरण। तो एक स्थैतिक विधि को ओवरराइड करने के बारे में मेरे प्रश्न के लिए (यदि बायडेफॉल्ट अंतिम है, तो उपयोगकर्ता इसे अंतिम नहीं बनाते) - क्या इसका मतलब यह है कि इस वर्ग का कोई उप-वर्ग नहीं है जो स्थैतिक रखता है, उसी हस्ताक्षर के साथ एक स्थिर विधि को परिभाषित कर सकता है? – aspiring