2012-06-22 12 views
5

मैं पालन अतः लेखव्युत्पन्न वर्ग का अपना स्थिर विधि में आधार वर्ग के स्थिर विधि कॉलिंग

के माध्यम से पढ़ा है सभी बहुत के करीब लग रहे हैं मेरे प्रश्न और अच्छे जवाब हैं, लेकिन वे मेरे प्रश्न का उत्तर देने के अलावा अन्य प्रश्नों का उत्तर नहीं देते हैं कि मुझे विधि को गैर स्थैतिक बनाने की आवश्यकता है।

एक उदाहरण:

abstract public class baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property1","property2"}); 
    // code for property definition and access 
    virtual public static bool ValidAttribtue(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
      return true; 
     else 
      return false; 
    } 
} 
class derivedA : baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property3","property4"}); 
    // code for property definition and access 
    public static override bool ValidAttribute(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
     { 
      return true; 
     } 
     else 
     { 
      return base.ValidAttribute(attributeName); 
     } 
    } 
} 
class derivedB : baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property10","property11"}); 
    // code for property definition and access 
    public static override bool ValidAttribute(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
     { 
      return true; 
     } 
     else 
     { 
      return base.ValidAttribute(attributeName); 
     } 
    } 
} 

derivedA गुण 1,2,3,4 है, जबकि derivedB गुण 1,2,10,11 होता होगा। गुणों की सूची एक वर्ग विशिष्ट मान प्रतीत होती है और इसे किसी भी समय बदला नहीं जा सकता है। मुझे लगता है कि यह स्थिर होगा।

मेरी डिजाइन भावना है कि मैं स्थिर तरीकों का उपयोग करने के लिए जब वे नहीं होना चाहिए कोशिश कर रहा हूँ में गलत है?

ऊपर के उदाहरण मुझे लगता है कि स्थिर तरीकों में से है कि विरासत की जरूरत होगी बनाता है, फिर भी ऐसा लगता है कि एक डिजाइन दोष है यह करने के लिए कोशिश कर रहा। क्या कोई मुझे यह समझने में मदद कर सकता है कि कोडिंग या कक्षाओं को इस तरह से संरचित करने में क्या गलत है?

+0

इस वास्तविक कोड है? आपके पास वर्चुअल स्थिर सदस्य नहीं हो सकते हैं। –

+0

नहीं, यह एक ऑपरेशन का सिर्फ उदाहरण कोड है जिसे मैं सोच रहा था, संभव होना चाहिए। –

उत्तर

8

क्या मेरा डिज़ाइन इस अर्थ में गलत है कि मैं स्थिर तरीकों का उपयोग करने की कोशिश कर रहा हूं जब वे नहीं होना चाहिए?

हां। किसी और चीज के अलावा, आप एक स्थिर विधि को virtual (और फिर इसे ओवरराइड करें) घोषित करने की कोशिश कर रहे हैं, जिसकी अनुमति नहीं है। आप base नामक कक्षा को घोषित करने का भी प्रयास कर रहे हैं, जब यह एक कीवर्ड है।

स्टेटिक तरीकों बस बहुरूपी नहीं हैं। बहुरूपता का आधार यह है कि शामिल उदाहरण का निष्पादन समय प्रकार अभिव्यक्ति के संकलन-समय प्रकार के लिए अलग हो सकता है, और कार्यान्वयन निष्पादन समय प्रकार के आधार पर चुना जाता है। यह अवधारणा स्थिर तरीकों के लिए समझ में नहीं आता है क्योंकि कोई उदाहरण नहीं है।

अब निश्चित रूप से आप व्युत्पन्न कक्षा में एक स्थिर विधि को बेस क्लास में एक स्थिर विधि कॉल कर सकते हैं - लेकिन कहीं भी कोई बहुलक नहीं होगा।

एक तरफ ध्यान दें के रूप में, अपने तरीके के सभी अधिक पठनीय तरह से लिखा जा सकता है:

// Base class implementation 
return attributeNames.Contains(attributeName); 

// Derived class implementations 
return attributeNames.Contains(attributeName) || 
     BaseClass.ValidAttribute(attributeName); 
+0

यह सुनिश्चित करने के लिए कि मैं इसे सही ढंग से समझ रहा हूं, अमूर्त वर्ग ऑपरेशन को परिभाषित करता है कि सभी व्युत्पन्न कक्षाएं होंगी। व्युत्पन्न कक्षाओं में कार्यक्षमता की आवश्यकता होती है। जांच कभी भी नहीं बदली जाती है और संकलन समय पर पूरी तरह परिभाषित होती है। किसी संपत्ति की उपस्थिति या अनुपस्थिति संकलन समय पर जानी जाती है। जांच को प्रति वर्ग बदलने की जरूरत है लेकिन बेस क्लास फ़ंक्शन का लाभ उठाने में सक्षम होना चाहिए। एक दूसरे पर यह इमारत स्थिर तंत्र नहीं है बल्कि इसके बजाय एक बहुरूपता तंत्र है? –

+0

@ जॉन ग्रोमन: यदि आपको * polymorphism की आवश्यकता नहीं है - यानी।एक उदाहरण के प्रकार के आधार पर निष्पादन समय पर "दाएं" कार्यान्वयन पर कॉल करना - फिर आप पॉलिमॉर्फिज्म के बिना ऐसा कर सकते हैं। मैं दृढ़ता से सलाह देता हूं कि आप इसे अलग-अलग नाम दें ताकि यह स्पष्ट हो सके कि वास्तव में * कोई भी बहुरूपता नहीं चल रही है, लेकिन यह एक वर्ग वर्ग की स्थैतिक विधि को बुलाए गए व्युत्पन्न वर्ग की स्थैतिक विधि के संदर्भ में काम करेगा। यह एक और स्थिर विधि है, जहां तक ​​भाषा का संबंध है - दोनों के बीच कोई संबंध नहीं है। –

+0

उत्तर और टिप्पणियों के लिए धन्यवाद मुझे लगता है कि मुझे बहुरूपता पर और अधिक पढ़ने की जरूरत है। अधिक पठनीय रूप के लिए भी धन्यवाद –

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