Компилятор C # жалуется, что абстрактный класс не реализует интерфейс? - PullRequest
29 голосов
/ 09 ноября 2009

У меня хороший интерфейс, и я хочу реализовать один его член в базовом классе, чтобы клиенты могли наследовать базовый класс и иметь меньше намеченной схемы для написания. Однако, несмотря на объявленное абстрактное, компилятор жалуется, что класс не реализует интерфейс?!? Как это должно быть сделано?

Код вопроса:

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 ]

41 голосов
/ 09 ноября 2009

Вы должны добавить абстрактную заглушку метода:

public abstract ITask CreateTask(TaskId id);

Наследующие затем могут переопределить его для реализации интерфейса.

4 голосов
/ 09 ноября 2009

Когда объект реализует интерфейс, он должен подчиняться всем ограничениям, применяемым интерфейсом. Это означает, что вы должны реализовать все свойства и методы, объявленные в интерфейсе.

В вашем случае вам не хватает реализации CreateTask. Кроме того, вы должны заметить, что C # использует свойства, в отличие от Java, например, который использует методы получения / установки. По этой причине вам не нужен метод 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 голос
/ 09 ноября 2009

TaskDefinitionBase должен включать CreateTask - если вы не хотите его реализовывать, просто пометьте метод как абстрактный, чтобы заставить любые реализующие классы реализовать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...