2010-10-18 12 views
9
interface IXXX 
{ 
    void Foo(); 
} 

class XXX : IXXX 
{ 
    public static void Foo() 
    { 
     Console.WriteLine("From XXX"); 
    } 
} 


class Program 
{ 
    static void Main(string[] args) 
    { 
     XXX.Foo(); 

    } 
} 

कंपाइलर त्रुटि: XXX.Foo() एक इंटरफ़ेस सदस्य को कार्यान्वित नहीं कर सकता क्योंकि यह स्थिर है।स्थैतिक विधि इंटरफ़ेस विधि को कार्यान्वित नहीं कर सकता है, क्यों?

एक स्थिर विधि एक इंटरफेस विधि क्यों लागू नहीं कर सकती है?

+0

यह समझ में नहीं आता है। XXX के व्युत्पन्न वर्ग में आप इंटरफ़ेस को कैसे कार्यान्वित करेंगे? हालांकि, कार्यान्वयन से स्थिर सदस्य को कॉल करने का कोई कारण नहीं है। – leppie

+1

http://stackoverflow.com/questions/259026/why-doesnt-c-allow-static-methods-to-implement-an-interface – bernhof

+0

@leppie, आप ** ** ** "टाइप विधि" हो सकते हैं; जहां कोई अंतर्निहित नहीं था, लेकिन इस प्रकार से रनटाइम पर विधि को हल किया गया। दुर्लभ मौकों का उपयोग करने के लिए उन्हें या तो उदाहरण के तरीकों या प्रतिबिंब के लिए कैटर किया जा सकता है, इसलिए दबाव डालने की आवश्यकता नहीं है आईएमओ। –

उत्तर

11

इस धागे को JoelOnSoftware से इस कारण के बारे में बताते हुए देखें।

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

अतः भी ठीक उसी सवाल से निपटने पर एक पहले प्रश्न: Why Doesn't C# Allow Static Methods to Implement an Interface?

4

एक इंटरफ़ेस उस व्यवहार को परिभाषित करता है जिसे किसी ऑब्जेक्ट को प्रतिसाद देना चाहिए। चूंकि फू एक स्थिर विधि है, ऑब्जेक्ट इसका जवाब नहीं देता है। दूसरे शब्दों में, आप नहीं लिख सकता है ...

XXX myXXX = new XXX(); 
myXXX.Foo(); 

दूसरे शब्दों में, myXXX पूरी तरह से इंटरफ़ेस की आवश्यकताओं को संतुष्ट नहीं करता है।

2

अगर हम एक वादा है कि एक वस्तु इंटरफ़ेस में सूचीबद्ध तरीकों प्रदर्शन कर सकते हैं के रूप में इंटरफेस को देखो, तो स्थिर कार्यान्वयन की चौथाई विचार हो जाता है समस्याग्रस्त। अगर लागू स्थिर है, तो आप नया कार्यान्वयन ऑब्जेक्ट() नहीं लिख सकते हैं। कार्यान्वित मैथोड। ऑब्जेक्ट विधि नहीं कर सकता, कक्षा कर सकते हैं।

2

आप तत्कालता के दौरान ठोस वर्ग का उपयोग करने से बचने के लिए इंटरफ़ेस का उपयोग करते हैं। आप तत्काल वर्ग के माध्यम से स्थैतिक विधि तक नहीं पहुंच सकते हैं, इसलिए स्थैतिक तरीकों के साथ इंटरफेस विधियों को लागू करने की अनुमति नहीं है।

0

क्योंकि इंटरफ़ेस सदस्य सार्वजनिक और अतिसंवेदनशील हैं, और यह स्थिर विधि डिज़ाइन द्वारा ओवरराइड या अमूर्त नहीं हो सकती है, इंटरफेस एक ठोस अनुबंध को परिभाषित करने के लिए यहां हैं जो उनके ठोस कार्यान्वयन द्वारा कार्यान्वित किया जाना चाहिए (अमूर्त कार्यान्वयन के कई चरणों के साथ & विरासत में मिला बीच में इंटरफेस) और जहां तक ​​मुझे पता है कि एक अमूर्त स्थैतिक विधि बनाने का कोई तरीका नहीं है।

1

अच्छा, मेरा मानना ​​है कि इसे सामान्य प्रकार पैरामीटर के मामले में अनुमति दी जानी चाहिए। यह शायद संविदात्मक सिंगलटन वर्ग को सरल बना दिया।

public interface IEntity { 
    // some constrains... 
    DataRow ObjToRow(object obj); 
    object RowToObj(DataRow dr); 
} 

//T would be any class inherites from IEntity with default contructor signature. 
public interface IMyContract { 
    T read<T>() where T : IEntity; 
    void write<T>(T object) where T : IEntity; 
} 

//everything in the class is static 
public static class SqlProvider : IMyContract { 

    public static T read<T>() where T: IEntity { 
    DataRow dr = [reading from database] 
    return T.RowToObj(dr); 
    } 

    //compile error here.... 
    public static void write<T>(T obj) where T : IEntity { 
    DataRow dr = T.ObjToRow(obj); 

    [ ... commit data row dr to database ... ] 

    } 
} 

public static class MyAppleEntity : IEntity { 
    [... implement IEntity contract normally ... ] 
} 

public static class MyOrangeEntity : IEntity { 
    [... implement IEntity contract normally ... ] 
} 

public class MyTest { 
    void reading() { 
    MyAppleEntity apple = SqlProvider.Read<MyAppleEntity>(); 
    MyOrangeEntity orange = SqlProvider.Read<MyOrangeEntity>(); 

    SqlProvider.write<MyAppleEntity>(apple); 
    SqlProvider.write<MyOrangeEntity>(orange); 
    } 

} 

केवल समय एक प्रकार संदर्भ परोक्ष) SqlProvider.read (में है और लिखने() और टी आह्वान के बिंदु पर अच्छी तरह से पहचान है: यहाँ एक उदाहरण है। इंटरफेस के स्थिर कार्यान्वयन के बिना मुझे इस तरह लिखने के लिए मजबूर किया गया है।

public class MyAppleEntity : IEntity { 
    [... implement IEntity contract normally ... ] 
} 

    ..... 

    public T read<T>() where T: IEntity, new() { 
    DataRow dr = [reading from database] 
    return new T().RowToObj(dr); 
    } 

बहुत कम अलग लेकिन सुरुचिपूर्ण नहीं है।

+0

मुझे विश्वास है कि यह कार्यात्मक भाषाएं 'मज़ेदार' कहती हैं। –

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