C#编译器抱怨抽象类没有实现接口?

C#编译器抱怨抽象类没有实现接口?,c#,inheritance,C#,Inheritance,我有一个很好的接口,我想在一个基类中实现它的一个成员,这样客户机就可以从基类派生,并且可以编写更少的模板。然而,即使声明为抽象,编译器也会抱怨类没有实现接口?!?这应该怎么做 有关守则: public interface ITaskDefinition { ITask CreateTask(TaskId id); string Name { get; } bool HasName { get; } } public abstract class TaskDefiniti

我有一个很好的接口,我想在一个基类中实现它的一个成员,这样客户机就可以从基类派生,并且可以编写更少的模板。然而,即使声明为抽象,编译器也会抱怨类没有实现接口?!?这应该怎么做

有关守则:

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)'

必须添加方法的抽象存根:

public abstract ITask CreateTask(TaskId id);

继承者可以重写它来实现接口。

TaskDefinitionBase需要包含CreateTask-如果不想实现它,只需将该方法标记为抽象,以强制任何实现类实现它。

当对象实现接口时,它必须遵守接口应用的所有约束。这意味着您必须实现接口中声明的所有属性和方法

在您的情况下,您缺少CreateTask的实现。另外,您应该注意到,C#使用的是属性,而Java使用的是getter/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;
        }
    }
}

提示-单击抽象类中的ITaskDefinition并按CTRL+。将为您解决此问题。就这样,我必须在实现中显式使用覆盖:/谢谢!他们确实需要专门为此添加一个编译器警告case@Simon_Weaver他们已经犯了错误。你还想要什么?@R.MartinhoFernandes我想他是说应该有一个错误/警告,上面说,
“抽象类型”不实现“接口”;创建一个抽象方法存根以解决此错误