2009-11-09 154 views
22

我有一個很好的接口,並且我想在基類中實現它的一個成員,這樣客戶端可以從基類派生並且具有較少的鍋爐板來編寫。但是,即使聲明爲抽象,編譯器也會抱怨類沒有實現接口?!?這應該怎麼做?C#編譯器抱怨抽象類沒有實現接口?

代碼的問題:

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; 
     } 
    } 
} 

,我得到的錯誤是:

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 2009-11-09 12:50:19

回答

34

您必須添加方法的抽象存根:然後

public abstract ITask CreateTask(TaskId id); 

繼承者可以覆蓋它來實現接口。

+1

就是這樣,我必須在執行過程中明確使用覆蓋:/謝謝! – Anteru 2009-11-09 12:51:41

+1

他們真的需要特別爲這種情況添加一個編譯器警告 – 2013-11-01 16:24:22

+0

@Simon_Weaver他們已經使它成爲*錯誤*。你還想要什麼? – 2013-11-01 16:25:38

1

TaskDefinitionBase需要包含CreateTask - 如果你不想實現它,只需將該方法標記爲抽象以強制任何實現類實現它。

4

當一個對象實現一個接口時,它必須遵守接口所應用的所有約束。這意味着你必須實現接口中聲明的所有屬性和方法。

在你的情況下,你錯過了CreateTask的實現。另外,你應該注意到C#使用屬性而不是Java,例如使用getters/setter。由於這個原因,你不需要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建議使'SetName'成爲一個真正的setter。 – 2009-11-09 12:54:45