代码之家  ›  专栏  ›  技术社区  ›  Anteru

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

  •  27
  • Anteru  · 技术社区  · 15 年前

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

    相关代码:

    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)'
    
    3 回复  |  直到 15 年前
        1
  •  39
  •   R. Martinho Fernandes    15 年前

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

    public abstract ITask CreateTask(TaskId id);
    

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

        2
  •  4
  •   Kasper Holdum    15 年前

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

    在您的案例中,您缺少CreateTask的实现。此外,您应该注意到C语言使用的属性与Java相反,例如使用GETSt/Stter。因此,您不需要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
  •  1
  •   JonoW    15 年前

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