75 votes

Forcer les sous-classes d'une interface à implémenter ToString [C #]

Disons que j'ai une interface IFoo et que je veux que toutes les sous-classes d'IFoo remplacent la méthode ToString de Object. Est-ce possible?

Ajouter simplement la signature de la méthode à IFoo en tant que tel ne fonctionne pas:

 interface IFoo
{
    String ToString();
}
 

... puisque toutes les sous-classes étendent Object et fournissent une implémentation de cette façon, le compilateur ne s'en plaint pas. Aucune suggestion?

Edit: titre fixe

107voto

Jon Skeet Points 692016

Je ne crois pas que vous puissiez le faire avec une interface. Vous pouvez utiliser une classe de base abstraite si:

 public abstract class Base
{
    public abstract override string ToString(); 
}
 

21voto

Andrew Peters Points 6012
abstract class Foo
{
    public override abstract string ToString();
}

class Bar : Foo
{
    // need to override ToString()
}

9voto

Mark Simpson Points 10789

Jon & Andrew: Ce tour abstrait est vraiment utile. Je ne savais pas que vous pouviez mettre fin à la chaîne en la déclarant abstraite. À votre santé :)

Dans le passé, lorsque j'avais demandé que ToString () soit écrasé dans des classes dérivées, j'avais toujours utilisé un modèle tel que celui-ci:

 public abstract class BaseClass
{
    public abstract string ToStringImpl();

    public override string ToString()
    {
        return ToStringImpl();
    }    
}
 

1voto

mindplay.dk Points 2555

Je sais que ce n'est pas la réponse à votre question, mais depuis il n'y a aucun moyen de faire ce que vous demandez, je pensais que je voudrais partager ma propre approche pour les autres à voir.

J'utilise un hybride de la Marque et Andrew solutions proposées.

Dans mon application, tous les domaine entités dériver d'un abrégé de la classe de base:

public abstract class Entity
{
    /// <summary>
    /// Returns a <see cref="System.String"/> that represents this instance.
    /// </summary>
    public override string ToString()
    {
        return this is IHasDescription
                   ? ((IHasDescription) this).EntityDescription
                   : base.ToString();
    }
}

L'interface elle-même définit seulement une simple accesseur:

public interface IHasDescription : IEntity
{
    /// <summary>
    /// Creates a description (in english) of the Entity.
    /// </summary>
    string EntityDescription { get; }
}

Alors maintenant, il y a un mécanisme de secours intégrée, ou en d'autres termes, une Entity qui implémente IHasDescription doit fournir à l' EntityDescription, mais tout Entity pouvez toujours convertir une chaîne de caractères.

Je sais que ce n'est pas radicalement différente de l'autre des solutions proposées ici, mais j'aime l'idée de minimiser la responsabilité de la base Entity type, de sorte que la mise en œuvre de la description de l'interface reste facultatif, mais vous êtes obligé de mise en œuvre de la description-méthode si vous êtes à la mise en œuvre de l'interface.

À mon humble avis, les interfaces implémentées par l' object de la classe de base ne devrait pas "compter" tel que mis en œuvre - il serait bien d'avoir une option de compilation pour ça, mais bon...

0voto

Frederick The Fool Points 9092

Je ne pense pas que vous puissiez forcer une sous-classe à remplacer l' une des méthodes virtuelles de la classe de base, à moins que ces méthodes ne soient abstraites.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X