2009-11-09 4 views
22

J'ai une belle interface, et je veux implémenter un membre dans une classe de base pour que les clients puissent dériver de la classe de base et avoir moins de plaque de chaudière à écrire. Cependant, même si déclaré abstrait, le compilateur se plaint que la classe n'implémente pas l'interface?!? Comment cela est-il censé être fait?Le compilateur C# se plaint que la classe abstraite n'implémente pas l'interface?

code en question:

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; 
     } 
    } 
} 

et l'erreur que je reçois est:

ITaskDefinition.cs(15,27): error CS0535: 'NetWork.Task.TaskDefinitionBase' does not implement interface member 'NetWork.Task.ITaskDefinition.CreateTask(NetWork.Task.TaskId)' 
+1

En pointe - cliquant sur le ITaskDefinition dans la classe abstraite et en appuyant sur CTRL +. va résoudre ce problème pour vous. – RichardOD

Répondre

34

Vous devez ajouter un talon abstrait de la méthode:

public abstract ITask CreateTask(TaskId id); 

Héritiers peut alors override pour mettre en œuvre l'interface.

+1

Voilà, je dois utiliser explicitement override dans l'implémentation:/Merci! – Anteru

+1

ils ont vraiment besoin d'ajouter un avertissement de compilateur spécifiquement pour ce cas –

+0

@Simon_Weaver Ils ont déjà fait une * erreur *. Que veux-tu de plus? –

1

TaskDefinitionBase doit inclure CreateTask - si vous ne voulez pas l'implémenter, marquez simplement la méthode comme abstraite pour forcer les classes d'implémentation à l'implémenter.

4

Lorsqu'un objet implémente une interface, il doit obéir à toutes les contraintes appliquées par l'interface. Cela signifie que vous devez implémenter toutes les propriétés et méthodes déclarées dans l'interface.

Dans votre cas, l'implémentation de CreateTask vous manque. De plus, vous devriez noter que C# utilise des propriétés contrairement à Java qui utilise par exemple des getters/setters. Pour cette raison, vous n'avez pas besoin d'une méthode SetName.

Code Vous devriez ressembler à ceci:

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

+ 1 pour suggérer de faire de Set Set un vrai setter. –

Questions connexes