2010-09-23 15 views
5

मुझे निम्न घटना को समझ में नहीं आ रहा है, क्या कोई मुझे समझा सकता है कृपया मुझे क्या गलत मिला?विरासत और स्थैतिक गुण

public class BaseClass 
{ 
    public BaseClass() 
    { 
     BaseClass.Instance = this; 
    } 

    public static BaseClass Instance 
    { 
     get; 
     private set; 
    } 
} 

public class SubClassA : BaseClass 
{ 
    public SubClassA() 
     : base() 
    { } 
} 

public class SubClassB : BaseClass 
{ 
    public SubClassB() 
     : base() 
    { } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     SubClassA a = new SubClassA(); 
     SubClassB b = new SubClassB(); 

     Console.WriteLine(SubClassA.Instance.GetType()); 
     Console.WriteLine(SubClassB.Instance.GetType()); 

     Console.Read(); 
    } 
} 

के रूप में मैं समझ गया, संकलक विरासत के माध्यम से एक नई प्रकार उत्पन्न करनी चाहिए, कि SubClassA और SubClassB वास्तव में खुद स्थैतिक चर के साथ खुद प्रकार हैं। लेकिन ऐसा लगता है कि वर्ग का स्थिर हिस्सा विरासत में नहीं मिला है लेकिन संदर्भित - मुझे क्या गलत लगता है?

उत्तर

10

.NET में विरासत केवल उदाहरण आधार पर काम करता है। स्टेटिक विधियों को टाइप स्तर पर परिभाषित किया गया है जो आवृत्ति स्तर पर नहीं हैं। यही कारण है कि ओवरराइडिंग स्थिर तरीकों/गुणों/घटनाओं के साथ काम नहीं करता है ...

स्टेटिक विधियां केवल स्मृति में एक बार आयोजित की जाती हैं। उनके लिए कोई वर्चुअल टेबल इत्यादि नहीं बनाई गई है।

यदि आप .NET में एक इंस्टेंस विधि का आह्वान करते हैं, तो आप हमेशा इसे वर्तमान उदाहरण देते हैं। यह .NET रनटाइम द्वारा छिपा हुआ है, लेकिन ऐसा होता है। प्रत्येक इंस्टेंस विधि के रूप में ऑब्जेक्ट को पॉइंटर (संदर्भ) के रूप में पहली बार तर्क दिया जाता है कि विधि चालू होती है। यह स्थैतिक तरीकों से नहीं होता है (क्योंकि वे प्रकार के स्तर पर परिभाषित होते हैं)। संकलक को आमंत्रित करने के तरीके को चुनने का निर्णय कैसे लेना चाहिए?

+0

मैं समझ नहीं आता कि क्यों विरासत उन उदाहरणों के काम करता है, लेकिन मुझे यह स्वीकार करना होगा। इस जानकारी के लिए धन्यवाद। –

+0

वही व्यवहार PHP और डेल्फी –

+0

@VladislavRastrusny में लागू किया गया है: मुझे नहीं पता कि यह 2010 में कैसा है। लेकिन अब 2016 में, PHP में 'self ::' और 'static ::' हैं। –

13

केवल एक स्थिर Instance संपत्ति है, और इसे BaseClass में परिभाषित किया गया है, जो एकमात्र प्रकार भी होता है जो इसे बदल सकता है (क्योंकि सेट private है)।

बात ये है कि अपने उपवर्गों SubClassA और SubClassB प्रत्येक आह्वान अपने स्वयं के निर्माताओं में BaseClass निर्माता है। यह कन्स्ट्रक्टर Instance को BaseClass उदाहरण में प्रारंभ किया गया है।

आपके उदाहरण कोड में आखिरी ऐसा उदाहरण SubClassB का उदाहरण होता है; इसलिए एकInstance संपत्ति इस उदाहरण पर सेट की जाती है जब तक आप अपने Console.WriteLine कॉल तक पहुंचते हैं।

आप अपने SubClassA और SubClassB वस्तुओं के निर्माण को उल्टा कर सकता है और आप SubClassA बजाय का एक उदाहरण के लिए Instance सेट देखना होगा।

+0

+1 यह भी समझाते हुए कि यह SubClassB को दो बार क्यों लिखता है –

0
क्योंकि इस तरह की समस्याओं का

, सिंगलटन कक्षाएं घोषित किया जाना चाहिए सील: MSDN Singletons

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