2009-11-09 33 views
22

मेरे पास एक अच्छा इंटरफ़ेस है, और मैं इसे बेस क्लास में एक सदस्य को कार्यान्वित करना चाहता हूं ताकि ग्राहक बेस क्लास से प्राप्त कर सकें और लिखने के लिए कम बॉयलर-प्लेट हो। हालांकि, भले ही अमूर्त घोषित किया गया हो, संकलक शिकायत करता है कि कक्षा इंटरफ़ेस को लागू नहीं करती है?! यह कैसे किया जाना चाहिए? सवाल मेंसी # कंपाइलर शिकायत करता है कि अमूर्त वर्ग इंटरफ़ेस को लागू नहीं करता है?

कोड:

public interface ITaskDefinition 
{ 
    ITask CreateTask(TaskId id); 
    string Name { get; } 
    bool HasName { get; } 
} 

public abstract class TaskDefinitionBase : ITaskDefinition 
{ 
    private string name_ = null; 

    public void SetName(string name) 
    { 
     name_ = name; 
    } 

    public string Name 
    { 
     get 
     { 
      return name_; 
     } 
    } 

    public bool HasName 
    { 
     get 
     { 
      return name_ != null; 
     } 
    } 
} 

और त्रुटि मैं मिलता है:

public abstract ITask CreateTask(TaskId id); 

उत्तराधिकारियों तो ओवरराइड कर सकते हैं:

ITaskDefinition.cs(15,27): error CS0535: 'NetWork.Task.TaskDefinitionBase' does not implement interface member 'NetWork.Task.ITaskDefinition.CreateTask(NetWork.Task.TaskId)' 
+1

एक टिप के रूप में - सार कक्षा में ITaskDefinition पर क्लिक करके और दबाने Ctrl +। यह आपके लिए ठीक करेगा। – RichardOD

उत्तर

34

आप विधि के एक अमूर्त ठूंठ को जोड़ना होगा यह इंटरफेस को लागू करने के लिए।

+1

यही है, मुझे स्पष्ट रूप से कार्यान्वयन में ओवरराइड का उपयोग करना होगा:/धन्यवाद! – Anteru

+1

उन्हें वास्तव में इस मामले के लिए विशेष रूप से एक संकलक चेतावनी जोड़ने की आवश्यकता है –

+0

@Simon_Weaver वे पहले से ही इसे * त्रुटि * बना चुके हैं। आपको और क्या चाहिए? –

1

टास्कडिफिनिशनबेस को CreateTask को शामिल करने की आवश्यकता है - यदि आप इसे कार्यान्वित नहीं करना चाहते हैं, तो इसे कार्यान्वित करने के लिए किसी कार्यान्वयन वर्ग को बल देने के लिए विधि को सार के रूप में चिह्नित करें।

4

जब कोई ऑब्जेक्ट किसी इंटरफ़ेस को लागू करता है तो उसे इंटरफ़ेस द्वारा लागू सभी बाधाओं का पालन करना होगा। इसका मतलब है कि आपको इंटरफ़ेस में घोषित सभी गुणों और विधियों को लागू करना होगा।

आपके मामले में आप CreateTask के कार्यान्वयन को याद कर रहे हैं। साथ ही, आपको ध्यान रखना चाहिए कि जावा के विपरीत सी # उपयोग गुण उदाहरण के लिए गेटर्स/सेटर्स का उपयोग करते हैं। इस कारण से आपको SetName विधि की आवश्यकता नहीं है।

आप कोड कुछ इस तरह दिखना चाहिए:

public abstract class TaskDefinitionBase : ITaskDefinition 
{ 
    private string name_ = null; 

    public abstract ITask CreateTask(TaskId id); 

    public string Name 
    { 
     get 
     { 
      return name_; 
     } 
     set 
     { 
      name_ = value 
     } 
    } 

    public bool HasName 
    { 
     get 
     { 
      return name_ != null; 
     } 
    } 
} 
+1

+1 को हल करने के लिए एक सार विधि स्टब बनाएं। –

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