【问题标题】:C# compiler complains that abstract class does not implement interface?C#编译器抱怨抽象类没有实现接口?
【发布时间】:2010-12-14 14:53:21
【问题描述】:

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

有问题的代码:

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

【问题讨论】:

  • 作为提示 - 单击抽象类中的 ITaskDefinition 并按 CTRL + 。将为您解决此问题。

标签: c# inheritance


【解决方案1】:

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

public abstract ITask CreateTask(TaskId id);

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

【讨论】:

  • 就是这样,我必须在实现中明确使用覆盖:/ 谢谢!
  • 他们确实需要专门针对这种情况添加编译器警告
  • @Simon_Weaver 他们已经把它变成了一个错误。你还想要什么?
  • @R.MartinhoFernandes 我认为他的意思是应该有一个错误/警告说,'Abstract type Type' does not implement 'Interface'; create an abstract method stub to solve this error
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2012-12-15
      • 2012-07-17
      • 2018-07-20
      • 2011-02-11
      相关资源
      最近更新 更多