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

33

我有一个不错的接口,想在一个基类中实现其中的一个成员函数,这样客户端就可以从基类派生,并且少编写一些重复代码。然而,尽管已经声明为抽象(abstract),编译器还是抱怨说该类没有实现接口???应该如何解决?

相关代码:

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
3个回答

48

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

public abstract ITask CreateTask(TaskId id);

继承者可以覆盖它以实现接口。


1
这就是了,我必须在实现中明确使用override :/ 谢谢! - Anteru
1
他们真的需要为这种情况添加一个编译器警告。 - Simon_Weaver
@Simon_Weaver 他们已经将其变成了一个“错误”。你还想要什么? - R. Martinho Fernandes
5
@R.MartinhoFernandes 我认为他的意思是应该有一个错误/警告,指出 '抽象类型Type'未实现'接口'; 创建一个抽象方法存根来解决此错误 - Ethan Reesor
FYI:在这种情况下,Visual Studio 2022会显示一个带有“实现接口”和“抽象实现接口”的选项的弹出窗口 - 这是一种提示。 - Ezh

4

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

在您的情况下,您缺少了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;
        }
    }
}

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接