Remplacement et héritage en C #

Remplacement et héritage en C #

En C#, les méthodes ne sont pas virtuelles par défaut, donc si vous concevez une méthode comme remplaçable, vous devez la spécifier comme virtuelle :

class Base 
{
  protected virtual string GetMood() {...}
}

Deuxièmement, vous devez spécifier que vous allez remplacer la méthode de la classe de base dans la classe dérivée.

class Derived : Base
{
  protected override string GetMood() {...}
}

Si vous ne spécifiez pas le mot-clé "override", vous obtiendrez une méthode qui masque le type de base (et un avertissement du compilateur pour mettre "nouveau" mot-clé pour que la méthode l'indique explicitement).

Si vous souhaitez arrêter la chaîne d'héritage et interdire d'autres remplacements de la méthode, vous devez marquer la méthode comme scellée, comme ceci :

  protected sealed override string GetMood() {...}

Vous devez utiliser le mot-clé override pour remplacer toute méthode virtuelle ou implémenter toute méthode abstraite.

public class MoodyObject
{
    protected virtual String getMood() 
    { 
        return "moody"; 
    }    
    public void queryMood() 
    { 
        Console.WriteLine("I feel " + getMood() + " today!"); 
    }
}

public class HappyObject : MoodyObject
{
    protected override string getMood()
    {
        return "happy";
    }
}

Ce que je recommanderais ici, c'est que vous vouliez probablement que MoodyObject soit une classe abstraite. (Vous devrez changer votre méthode principale si vous faites cela, mais vous devriez l'explorer) Est-il vraiment logique d'être en mode lunatique ? Le problème avec ce que nous avons ci-dessus est que votre HappyObject n'est pas obligé de fournir une implémentation pour getMood. En rendant une classe abstraite, elle fait plusieurs choses :

  1. Vous ne pouvez pas créer une nouvelle instance d'une classe abstraite. Vous devez utiliser une classe enfant.
  2. Vous pouvez forcer les enfants dérivés à implémenter certaines méthodes.

Donc, pour ce faire, vous vous retrouvez :

public abstract class MoodyObject
{
    protected abstract String getMood();

    public void queryMood() 
    { 
        Console.WriteLine("I feel " + getMood() + " today!"); 
    }
}

Notez que vous ne fournissez plus d'implémentation pour getMood.


Autant que je sache, en Java, toutes les méthodes sont virtuelles par défaut. Ce n'est pas le cas avec C #, vous devez donc marquer les méthodes de classe de base avec "virtuel", par exemple. protected virtual string getMood() ... et les dérogations avec "override", par ex. protected override string getMood()... .