Dans quels cas est-il recommandé d'utiliser virtuel ou abstrait? Quelle est l'approche la plus correcte?
Réponses
Trop de publicités?Une fonction abstraite ne peut avoir aucune fonctionnalité. Vous êtes en train de dire que toute classe enfant DOIT donner sa propre version de cette méthode, mais il est trop général pour essayer même de l'implémenter dans la classe parente. Une fonction virtuelle, c'est essentiellement dire look, voici la fonctionnalité qui peut ou ne peut pas être assez bon pour la classe enfant. Donc, si cela est suffisant, utilisez cette méthode, sinon, remplacez-moi, et fournissez vos propres fonctionnalités.
Une fonction abstraite n'a pas d'implémentation et elle ne peut être déclarée que sur une classe abstraite. Cela force la classe dérivée à fournir une implémentation. Une fonction virtuelle fournit une implémentation par défaut et peut exister sur une classe abstraite ou une classe non abstraite. Donc par exemple:
public abstract class myBase
{
//If you derive from this class you must implement this method. notice we have no method body here either
public abstract void YouMustImplement();
//If you derive from this class you can change the behavior but are not required to
public virtual void YouCanOverride()
{
}
}
public class MyBase
{
//This will not compile because you cannot have an abstract method in a non-abstract class
public abstract void YouMustImplement();
}
La méthode abstraite: Si une classe contient une méthode abstraite, cette classe doit être déclarée abstraite. La méthode abstraite n'a pas de mise en œuvre et ainsi, les classes dérivant de cette classe abstraite, doit fournir une implémentation de cette méthode abstraite.
Méthode virtuelle: Une classe peut avoir une méthode virtuelle. La méthode virtuelle est mise en œuvre. Lorsque vous héritez d'une classe qui possède une méthode virtuelle, vous pouvez remplacer la méthode virtuelle et de fournir plus de logique, ou de remplacer la logique avec votre propre mise en œuvre.
Quand utiliser ce:
Dans certains cas, vous savez que certains d'entre eux doivent avoir une méthode spécifique, mais vous ne savez pas ce que la mise en œuvre de cette méthode doit avoir.
Dans de tels cas, vous pouvez créer une interface qui contient une méthode avec cette signature.
Toutefois, si vous avez un tel cas, mais vous savez que des réalisateurs de cette interface aura également une autre méthode commune (pour lesquelles vous pouvez déjà la mise en œuvre), vous pouvez créer une classe abstraite.
Cette classe abstraite contient alors la méthode abstraite (qui doit être surchargée), et une autre méthode qui contient la "commune" de la logique.
Une méthode virtuelle doit être utilisé si vous avez une classe qui peut être utilisé directement, mais pour lequel vous souhaitez héritiers pour être en mesure de modifier certains comportements, bien qu'il n'est pas obligatoire.