Когда объект реализует интерфейс, он должен подчиняться всем ограничениям, применяемым интерфейсом. Это означает, что вы должны реализовать все свойства и методы, объявленные в интерфейсе.
В вашем случае вам не хватает реализации 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;
}
}
}